課題

以下の指標の中から、一つを選択して、データを WDI で取得し、以下の分析をする。

  1. 各年毎のデータの数の棒グラフ
  2. 日本のデータの年の降順での表示
  3. 経年変化を表す折れ線グラフ
    1. 日本
    2. 南部アフリカ関税同盟の5カ国
    3. 選択したいくつかの国
  4. データが十分ある最近の年の値のヒストグラム
  5. データが十分ある最近の年の値の10カ国の値の棒グラフ
    1. 値が大きい方から
    2. 値が小さい方から

それぞれについて考察(気づいたこと、疑問など)を記す

2023.1.25. 23:59 までに Moodle の演習の課題ボックスに提出したものについては、なるべく、早く見て、フィードバックを書きます。それ以降に提出されたものも見ますが、フィードバックは遅くなると思ってください。

データ

  1. Government expenditure on education, total (% of GDP):SE.XPD.TOTL.GD.ZS [Link]

  2. School enrollment, primary (% gross):SE.PRM.ENRR [Link]

  3. School enrollment, secondary (% gross):SE.SEC.ENRR [Link]

  4. School enrollment, tertiary (% gross):SE.TER.ENRR [Link]

  5. Mortality rate, under-5 (per 1,000 live births):SH.DYN.MORT [Link]

  6. School enrollment, primary and secondary (gross), gender parity index (GPI):SE.ENR.PRSC.FM.ZS [Link]

  7. Ratio of female to male labor force participation rate (%) (modeled ILO estimate):SL.TLF.CACT.FM.ZS [Link]

  8. Unemployment, female (% of female labor force) (modeled ILO estimate):SL.UEM.TOTL.FE.ZS [Link]

  9. Unemployment, male (% of male labor force) (modeled ILO estimate):SL.UEM.TOTL.MA.ZS [Link]

  10. Net official development assistance and official aid received (current US$) DT.ODA.ALLD.CD [Link]

1. 国の教育に関する支出

概要:国内総生産(GDP)に対する、国の教育に関する支出(Government expenditure on education, total (% of GDP))のデータの分析を行う

データ

Government expenditure on education, total (% of GDP):SE.XPD.TOTL.GD.ZS [Link]

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_ed_exp <- WDI(indicator = c(ed_exp = "SE.XPD.TOTL.GD.ZS"))
write_csv(df_ed_exp, "data/ed_exp.csv")
df_ed_exp <- read_csv("data/ed_exp.csv")
Rows: 16758 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, ed_exp
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_ed_exp
str(df_ed_exp)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country: chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c  : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c  : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year   : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ ed_exp : num [1:16758] 3.91 4.63 4.35 4.54 4.74 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   ed_exp = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_ed_exp |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_ed_exp |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_ed_exp |> drop_na(ed_exp) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の教育費(% of GDP)

df_ed_exp |> filter(country == "Japan") |> 
  drop_na(ed_exp) |> arrange(desc(year))

3. 経年変化

a. 日本

df_ed_exp |> filter(country == "Japan") |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line()

気づいたこと・疑問

  • 1970年代の急激な上昇、1990年ごろの急激な現象は、何が原因なのだろう。

  • 2014年ごろから減少、2018年ごろから増加、2020年から2021年は減少。

b. 南部アフリカ関税同盟

df_ed_exp |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_ed_exp |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 平均で見ると、上昇してきており、7% 程度という大きな割合になっている。

c. ラテンアメリカ4カ国

df_ed_exp |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_ed_exp |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_ed_exp |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(ed_exp) |>
  ggplot(aes(ed_exp)) + geom_histogram(binwidth = 1)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_ed_exp |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 3.416981
SAF <- df_ed_exp |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(ed_exp)
df_ed_exp |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(ed_exp) |>
  ggplot() + geom_histogram(aes(ed_exp), binwidth = 1) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の教育費の対GDP百分率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_ed_exp |> filter(year == 2020) |> drop_na(ed_exp) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(ed_exp)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, ed_exp), ed_exp)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "Government expenditure on education, total (% of GDP)")

b. 値が小さい方から

df_ed_exp |> filter(year == 2020) |> drop_na(ed_exp) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(ed_exp) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, ed_exp)), ed_exp)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "Government expenditure on education, total (% of GDP)")

2. 初等学校就学率

データ

  • School enrollment, primary (% gross):SE.PRM.ENRR [Link]

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_primary <- WDI(indicator = c(primary = "SE.PRM.ENRR"))
write_csv(df_primary, "data/primary.csv")
df_primary <- read_csv("data/primary.csv")
Rows: 16758 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, primary
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_primary
str(df_primary)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country: chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c  : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c  : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year   : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ primary: num [1:16758] 105 105 106 105 104 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   primary = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_primary |> filter(iso2c %in% REGION) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_primary |> drop_na(primary) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の初等学校就学率

df_primary |> filter(country == "Japan") |> 
  drop_na(primary) |> arrange(desc(year))

3. 経年変化

a. 日本

df_primary |> filter(country == "Japan") |> drop_na(primary) |>
  ggplot(aes(year, primary)) + geom_line()

気づいたこと・疑問

  • 1970年代の急激な上昇・下降、1980年ごろから上昇、そこで、100 を超えている。1995年ごろからは、減少しているが、まだ、100以上である。何が原因なのだろう。

b. 南部アフリカ関税同盟

df_primary |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(primary) |>
  ggplot(aes(year, primary)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_primary |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(primary) |>
  ggplot(aes(year, primary)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 100を超えている。

c. ラテンアメリカ4カ国

df_primary |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(primary) |>
  ggplot(aes(year, primary)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_primary |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(primary) |>
  ggplot(aes(year, primary)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_primary |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(primary) |>
  ggplot(aes(primary)) + geom_histogram(binwidth = 5)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_primary |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 102.73683
SAF <- df_primary |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(primary)
df_primary |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(primary) |>
  ggplot() + geom_histogram(aes(primary), binwidth = 5) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の初等学校就学率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_primary |> filter(year == 2020) |> drop_na(primary) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(primary)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, primary), primary)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "初等学校就学率")

b. 値が小さい方から

df_primary |> filter(year == 2020) |> drop_na(primary) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(primary) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, primary)), primary)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "初等学校就学率")

3. 中等学校就学率

データ

  • School enrollment, secondary (% gross):SE.SEC.ENRR [Link]

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_secondary <- WDI(indicator = c(secondary = "SE.SEC.ENRR"))
write_csv(df_secondary, "data/secondary.csv")
df_secondary <- read_csv("data/secondary.csv")
Rows: 16758 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, secondary
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_secondary
str(df_secondary)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country  : chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c    : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c    : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year     : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ secondary: num [1:16758] NA NA 43.8 43.4 43.2 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   secondary = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_secondary |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_secondary |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_secondary |> drop_na(secondary) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の中等学校就学率

df_secondary |> filter(country == "Japan") |> 
  drop_na(secondary) |> arrange(desc(year))

3. 経年変化

a. 日本

df_secondary |> filter(country == "Japan") |> drop_na(secondary) |>
  ggplot(aes(year, secondary)) + geom_line()

気づいたこと・疑問

  • 2000年ごろから減少、その後も変化がある。何が原因なのだろう。

b. 南部アフリカ関税同盟

df_secondary |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(secondary) |>
  ggplot(aes(year, secondary)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_secondary |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(secondary) |>
  ggplot(aes(year, secondary)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 平均で見ると、一定して上昇している。

c. ラテンアメリカ4カ国

df_secondary |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(secondary) |>
  ggplot(aes(year, secondary)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_secondary |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(secondary) |>
  ggplot(aes(year, secondary)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_secondary |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(secondary) |>
  ggplot(aes(secondary)) + geom_histogram(binwidth = 10)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_secondary |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 102.84480
SAF <- df_secondary |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(secondary)
df_secondary |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(secondary) |>
  ggplot() + geom_histogram(aes(secondary), binwidth = 10) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の中等学校就学率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_secondary |> filter(year == 2020) |> drop_na(secondary) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(secondary)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, secondary), secondary)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "secondary school enrollment")

b. 値が小さい方から

df_secondary |> filter(year == 2020) |> drop_na(secondary) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(secondary) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, secondary)), secondary)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "secondary schooll enrollment")

4. 中等学校後の就学率

データ

  • School enrollment, tertiary (% gross):SE.TER.ENRR [Link]

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_tertiary <- WDI(indicator = c(tertiary = "SE.TER.ENRR"))
write_csv(df_tertiary, "data/tertiary.csv")
df_tertiary <- read_csv("data/tertiary.csv")
Rows: 16758 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, tertiary
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_tertiary
str(df_tertiary)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country : chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c   : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c   : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year    : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ tertiary: num [1:16758] NA 8.85 9.23 8.81 8.9 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   tertiary = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_tertiary |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_tertiary |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_tertiary |> drop_na(tertiary) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の教育費(% of GDP)

df_tertiary |> filter(country == "Japan") |> 
  drop_na(tertiary) |> arrange(desc(year))

3. 経年変化

a. 日本

df_tertiary |> filter(country == "Japan") |> drop_na(tertiary) |>
  ggplot(aes(year, tertiary)) + geom_line()

気づいたこと・疑問

  • 1970年代の急激な上昇、1990年ごろからまた増加は、何が原因なのだろう。

  • どのように、中等学校後について定めているのだろう。

b. 南部アフリカ関税同盟

df_tertiary |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(tertiary) |>
  ggplot(aes(year, tertiary)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_tertiary |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(tertiary) |>
  ggplot(aes(year, tertiary)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 平均で見ると、上昇してきており、7% 程度という大きな割合になっている。

c. ラテンアメリカ4カ国

df_tertiary |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(tertiary) |>
  ggplot(aes(year, tertiary)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_tertiary |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(tertiary) |>
  ggplot(aes(year, tertiary)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_tertiary |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(tertiary) |>
  ggplot(aes(tertiary)) + geom_histogram(binwidth = 10)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_tertiary |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 62.13584
SAF <- df_tertiary |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(tertiary)
df_tertiary |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(tertiary) |>
  ggplot() + geom_histogram(aes(tertiary), binwidth = 10) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の中等学校後の就学率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_tertiary |> filter(year == 2020) |> drop_na(tertiary) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(tertiary)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, tertiary), tertiary)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "tertiary school enrollment")

b. 値が小さい方から

df_tertiary |> filter(year == 2020) |> drop_na(tertiary) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(tertiary) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, tertiary)), tertiary)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "tertiary school enrollment")

5. 五歳未満の死亡率

データ

  • Mortality rate, under-5 (per 1,000 live births):SH.DYN.MORT [Link]

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_under5 <- WDI(indicator = c(under5 = "SH.DYN.MORT"))
write_csv(df_under5, "data/under5.csv")
df_under5 <- read_csv("data/under5.csv")
Rows: 16758 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, under5
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_under5
str(df_under5)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country: chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c  : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c  : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year   : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ under5 : num [1:16758] NA 57.3 59.1 60.9 62.9 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   under5 = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_under5 |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_under5 |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_under5 |> drop_na(under5) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 五歳未満死亡率(1000人あたり)

df_under5 |> filter(country == "Japan") |> 
  drop_na(under5) |> arrange(desc(year))

3. 経年変化

a. 日本

df_under5 |> filter(country == "Japan") |> drop_na(under5) |>
  ggplot(aes(year, under5)) + geom_line()

気づいたこと・疑問

  • 継続的に減少している。

  • 1960年ごろは40% ということは、1950年ごろは、50% ぐらいだったのだろうか。

b. 南部アフリカ関税同盟

df_under5 |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(under5) |>
  ggplot(aes(year, under5)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_under5 |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(under5) |>
  ggplot(aes(year, under5)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 2000年すぎに上昇しているが、それ以外は、減少している。
  • 紛争だろうか。

c. ラテンアメリカ4カ国

df_under5 |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(under5) |>
  ggplot(aes(year, under5)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_under5 |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(under5) |>
  ggplot(aes(year, under5)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_under5 |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(under5) |>
  ggplot(aes(under5)) + geom_histogram(binwidth = 10)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_under5 |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 2.4
SAF <- df_under5 |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(under5)
df_under5 |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(under5) |>
  ggplot() + geom_histogram(aes(under5), binwidth = 10) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "五歳未満の死亡率(1000人あたり)", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_under5 |> filter(year == 2020) |> drop_na(under5) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(under5)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, under5), under5)) + geom_col() + 
  coord_flip() + labs(title = "五歳未満の死亡率(1000人あたり)", x = "country")

b. 値が小さい方から

df_under5 |> filter(year == 2020) |> drop_na(under5) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(under5) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, under5)), under5)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", y = "under 5 mortality", x = "country")

6. 初等中等学校就学率(性差)

データ

  • School enrollment, primary and secondary (gross), gender parity index (GPI):SE.ENR.PRSC.FM.ZS [Link]

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_school_gpi <- WDI(indicator = c(school_gpi = "SE.ENR.PRSC.FM.ZS"))
write_csv(df_school_gpi, "data/school_gpi.csv")
df_school_gpi <- read_csv("data/school_gpi.csv")
Rows: 16758 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, school_gpi
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_school_gpi
str(df_school_gpi)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country   : chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c     : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c     : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year      : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ school_gpi: num [1:16758] NA NA 0.944 0.941 0.94 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   school_gpi = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_school_gpi |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_school_gpi |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_school_gpi |> drop_na(school_gpi) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の初等中等学校就学率における GPI

df_school_gpi |> filter(country == "Japan") |> 
  drop_na(school_gpi) |> arrange(desc(year))

3. 経年変化

a. 日本

df_school_gpi |> filter(country == "Japan") |> drop_na(school_gpi) |>
  ggplot(aes(year, school_gpi)) + geom_line()

気づいたこと・疑問

  • 1995年ごろまでは揺らぎがある。そのあとは、下降。

  • 差が小さいので、あまり、気にするのは適切ではないかもしれない。

b. 南部アフリカ関税同盟

df_school_gpi |> filter(country %in% SOUTH_AFRICA_FIVE) |> 
  drop_na(school_gpi) |>
  ggplot(aes(year, school_gpi)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_school_gpi |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(school_gpi) |>
  ggplot(aes(year, school_gpi)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • ゆるやかに減少。1.0 に近づいている。

c. ラテンアメリカ4カ国

df_school_gpi |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(school_gpi) |>
  ggplot(aes(year, school_gpi)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_school_gpi |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(school_gpi) |>
  ggplot(aes(year, school_gpi)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、2020年のデータは少ないので、2019年について見てみる。

df_school_gpi |> filter(year == 2019) |> filter(!(country %in% REGION))|>
  drop_na(school_gpi) |>
  ggplot(aes(school_gpi)) + geom_histogram(binwidth = 0.02)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_school_gpi |> filter(year == 2019) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 1.00341 # no recent data after 2019
SAF <- df_school_gpi |> filter(year == 2019) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(school_gpi)
df_school_gpi |> filter(year == 2019) |> filter(!(country %in% REGION))|>
  drop_na(school_gpi) |>
  ggplot() + geom_histogram(aes(school_gpi), binwidth = 0.02) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2019年の初等中等学校就学率 GPI", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_school_gpi |> filter(year == 2019) |> drop_na(school_gpi) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(school_gpi)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, school_gpi), school_gpi)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "primary and secondary enrollment, GPI")

b. 値が小さい方から

df_school_gpi |> filter(year == 2019) |> drop_na(school_gpi) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(school_gpi) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, school_gpi)), school_gpi)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "primary and secondary enrollment, GPI")

7. 女性就労率

データ

  • Ratio of female to male labor force participation rate (%) (modeled ILO estimate):SL.TLF.CACT.FM.ZS [Link]

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_job_gpi <- WDI(indicator = c(job_gpi = "SL.TLF.CACT.FM.ZS"))
write_csv(df_job_gpi, "data/job_gpi.csv")
df_job_gpi <- read_csv("data/job_gpi.csv")
Rows: 16758 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, job_gpi
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_job_gpi
str(df_job_gpi)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country: chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c  : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c  : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year   : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ job_gpi: num [1:16758] 87.5 87.2 86.7 86.9 86.6 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   job_gpi = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_job_gpi |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_job_gpi |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_job_gpi |> drop_na(job_gpi) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の女性就労率

df_job_gpi |> filter(country == "Japan") |> 
  drop_na(job_gpi) |> arrange(desc(year))

3. 経年変化

a. 日本

df_job_gpi |> filter(country == "Japan") |> drop_na(job_gpi) |>
  ggplot(aes(year, job_gpi)) + geom_line()

気づいたこと・疑問

  • 2000年ごろからは上昇している。どんな政策変更があったのだろうか。

  • このまま、上昇すると、2040年ごろには、90を超え、100に近づく。それで、問題は解決したと言えるのだろうか。

b. 南部アフリカ関税同盟

df_job_gpi |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(job_gpi) |>
  ggplot(aes(year, job_gpi)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_job_gpi |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(job_gpi) |>
  ggplot(aes(year, job_gpi)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 全体的には上昇している。

c. ラテンアメリカ4カ国

df_job_gpi |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(job_gpi) |>
  ggplot(aes(year, job_gpi)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_job_gpi |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(job_gpi) |>
  ggplot(aes(year, job_gpi)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_job_gpi |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(job_gpi) |>
  ggplot(aes(job_gpi)) + geom_histogram(binwidth = 10)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_job_gpi |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 74.51027
SAF <- df_job_gpi |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(job_gpi)
df_job_gpi |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(job_gpi) |>
  ggplot() + geom_histogram(aes(job_gpi), binwidth = 10) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "女性の就労率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_job_gpi |> filter(year == 2020) |> drop_na(job_gpi) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(job_gpi)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, job_gpi), job_gpi)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "labor force participation rate of ")

b. 値が小さい方から

df_job_gpi |> filter(year == 2020) |> drop_na(job_gpi) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(job_gpi) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, job_gpi)), job_gpi)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "labor force participation rate")

8. 女性失業率

データ

  • Unemployment, female (% of female labor force) (modeled ILO estimate):SL.UEM.TOTL.FE.ZS [Link]

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_female_unemploy <- WDI(indicator = c(female_unemploy = "SL.UEM.TOTL.FE.ZS"))
write_csv(df_female_unemploy, "data/female_unemploy.csv")
df_female_unemploy <- read_csv("data/female_unemploy.csv")
Rows: 16758 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, female_unemploy
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_female_unemploy
str(df_female_unemploy)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country        : chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c          : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c          : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year           : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ female_unemploy: num [1:16758] 8.51 8.5 8.12 7.62 7.42 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   female_unemploy = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_female_unemploy |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_female_unemploy |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_female_unemploy |> drop_na(female_unemploy) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の女性失業率

df_female_unemploy |> filter(country == "Japan") |> 
  drop_na(female_unemploy) |> arrange(desc(year))

3. 経年変化

a. 日本

df_female_unemploy |> filter(country == "Japan") |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy)) + geom_line()

気づいたこと・疑問

  • 2000年ごろから、2010年ごろまで非常に高い水準になっている。何が原因なのだろう。

b. 南部アフリカ関税同盟

df_female_unemploy |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_female_unemploy |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 平均で見ると、23%程度。

c. ラテンアメリカ4カ国

df_female_unemploy |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_female_unemploy |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_female_unemploy |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(female_unemploy) |>
  ggplot(aes(female_unemploy)) + geom_histogram(binwidth = 2)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_female_unemploy |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 2.520
SAF <- df_female_unemploy |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(female_unemploy)
df_female_unemploy |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(female_unemploy) |>
  ggplot() + geom_histogram(aes(female_unemploy), binwidth = 2) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の女性の求職率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_female_unemploy |> filter(year == 2020) |> drop_na(female_unemploy) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(female_unemploy)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, female_unemploy), female_unemploy)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "unemployment rate, female, 2020")

b. 値が小さい方から

df_female_unemploy |> filter(year == 2020) |> drop_na(female_unemploy) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(female_unemploy) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, female_unemploy)), female_unemploy)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "unemployment rate, female, 2020")

男性失業率

データ

  • Unemployment, male (% of male labor force) (modeled ILO estimate):SL.UEM.TOTL.MA.ZS [Link]

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_ed_exp <- WDI(indicator = c(ed_exp = "SE.XPD.TOTL.GD.ZS"))
write_csv(df_ed_exp, "data/ed_exp.csv")
df_ed_exp <- read_csv("data/ed_exp.csv")

データの確認

df_ed_exp
str(df_ed_exp)
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_ed_exp |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_ed_exp |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_ed_exp |> drop_na(ed_exp) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の教育費(% of GDP)

df_ed_exp |> filter(country == "Japan") |> 
  drop_na(ed_exp) |> arrange(desc(year))

3. 経年変化

a. 日本

df_ed_exp |> filter(country == "Japan") |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line()

気づいたこと・疑問

  • 1970年代の急激な上昇、1990年ごろの急激な現象は、何が原因なのだろう。

  • 2014年ごろから減少、2018年ごろから増加、2020年から2021年は減少。

b. 南部アフリカ関税同盟

df_ed_exp |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_ed_exp |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 平均で見ると、上昇してきており、7% 程度という大きな割合になっている。

c. ラテンアメリカ4カ国

df_ed_exp |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_ed_exp |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_ed_exp |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(ed_exp) |>
  ggplot(aes(ed_exp)) + geom_histogram(binwidth = 1)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_ed_exp |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 3.416981
SAF <- df_ed_exp |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(ed_exp)
df_ed_exp |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(ed_exp) |>
  ggplot() + geom_histogram(aes(ed_exp), binwidth = 1) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の教育費の対GDP百分率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_ed_exp |> filter(year == 2020) |> drop_na(ed_exp) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(ed_exp)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, ed_exp), ed_exp)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "Government expenditure on education, total (% of GDP)")

b. 値が小さい方から

df_ed_exp |> filter(year == 2020) |> drop_na(ed_exp) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(ed_exp) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, ed_exp)), ed_exp)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "Government expenditure on education, total (% of GDP)")

10. 負債率

データ

  • Net official development assistance and official aid received (current US$) DT.ODA.ALLD.CD [Link]

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_ed_exp <- WDI(indicator = c(ed_exp = "SE.XPD.TOTL.GD.ZS"))
write_csv(df_ed_exp, "data/ed_exp.csv")
df_ed_exp <- read_csv("data/ed_exp.csv")

データの確認

df_ed_exp
str(df_ed_exp)
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_ed_exp |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_ed_exp |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_ed_exp |> drop_na(ed_exp) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の教育費(% of GDP)

df_ed_exp |> filter(country == "Japan") |> 
  drop_na(ed_exp) |> arrange(desc(year))

3. 経年変化

a. 日本

df_ed_exp |> filter(country == "Japan") |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line()

気づいたこと・疑問

  • 1970年代の急激な上昇、1990年ごろの急激な現象は、何が原因なのだろう。

  • 2014年ごろから減少、2018年ごろから増加、2020年から2021年は減少。

b. 南部アフリカ関税同盟

df_ed_exp |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_ed_exp |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 平均で見ると、上昇してきており、7% 程度という大きな割合になっている。

c. ラテンアメリカ4カ国

df_ed_exp |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_ed_exp |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_ed_exp |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(ed_exp) |>
  ggplot(aes(ed_exp)) + geom_histogram(binwidth = 1)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_ed_exp |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 3.416981
SAF <- df_ed_exp |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(ed_exp)
df_ed_exp |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(ed_exp) |>
  ggplot() + geom_histogram(aes(ed_exp), binwidth = 1) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の教育費の対GDP百分率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_ed_exp |> filter(year == 2020) |> drop_na(ed_exp) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(ed_exp)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, ed_exp), ed_exp)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "Government expenditure on education, total (% of GDP)")

b. 値が小さい方から

df_ed_exp |> filter(year == 2020) |> drop_na(ed_exp) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(ed_exp) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, ed_exp)), ed_exp)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "Government expenditure on education, total (% of GDP)")
LS0tCnRpdGxlOiAi5o6i57Si55qE44OH44O844K/5YiG5p6QMCAtIEVEQTAiCmF1dGhvcjogIkguIFN1enVraSIKZGF0ZTogIjIwMjTlubQx5pyIMjPml6UiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0Ci0tLQoKIyMg6Kqy6aGMCgrku6XkuIvjga7mjIfmqJnjga7kuK3jgYvjgonjgIHkuIDjgaTjgpLpgbjmip7jgZfjgabjgIHjg4fjg7zjgr/jgpIgV0RJIOOBp+WPluW+l+OBl+OAgeS7peS4i+OBruWIhuaekOOCkuOBmeOCi+OAggoKMS4gIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoyLiAg5pel5pys44Gu44OH44O844K/44Gu5bm044Gu6ZmN6aCG44Gn44Gu6KGo56S6CjMuICDntYzlubTlpInljJbjgpLooajjgZnmipjjgoznt5rjgrDjg6njg5UKICAgIGEuICDml6XmnKwKICAgIGIuICDljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm5/jga7vvJXjgqvlm70KICAgIGMuICDpgbjmip7jgZfjgZ/jgYTjgY/jgaTjgYvjga7lm70KNC4gIOODh+ODvOOCv+OBjOWNgeWIhuOBguOCi+acgOi/keOBruW5tOOBruWApOOBruODkuOCueODiOOCsOODqeODoAo1LiAg44OH44O844K/44GM5Y2B5YiG44GC44KL5pyA6L+R44Gu5bm044Gu5YCk44GuMTDjgqvlm73jga7lgKTjga7mo5LjgrDjg6njg5UKICAgIGEuICDlgKTjgYzlpKfjgY3jgYTmlrnjgYvjgokKICAgIGIuICDlgKTjgYzlsI/jgZXjgYTmlrnjgYvjgokKCuOBneOCjOOBnuOCjOOBq+OBpOOBhOOBpuiAg+Wvn++8iOawl+OBpeOBhOOBn+OBk+OBqOOAgeeWkeWVj+OBquOBqe+8ieOCkuiomOOBmQoKKioyMDIzLjEuMjUuIDIzOjU5Kiog44G+44Gn44GrIE1vb2RsZSDjga7mvJTnv5Ljga7oqrLpoYzjg5zjg4Pjgq/jgrnjgavmj5Dlh7rjgZfjgZ/jgoLjga7jgavjgaTjgYTjgabjga/jgIHjgarjgovjgbnjgY/jgIHml6njgY/opovjgabjgIHjg5XjgqPjg7zjg4njg5Djg4Pjgq/jgpLmm7jjgY3jgb7jgZnjgILjgZ3jgozku6XpmY3jgavmj5Dlh7rjgZXjgozjgZ/jgoLjga7jgoLopovjgb7jgZnjgYzjgIHjg5XjgqPjg7zjg4njg5Djg4Pjgq/jga/pgYXjgY/jgarjgovjgajmgJ3jgaPjgabjgY/jgaDjgZXjgYTjgIIKCiMjIyDjg4fjg7zjgr8KCjEuICBHb3Zlcm5tZW50IGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiwgdG90YWwgKCUgb2YgR0RQKe+8mlNFLlhQRC5UT1RMLkdELlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NFLlhQRC5UT1RMLkdELlpTKV0KCjIuICBTY2hvb2wgZW5yb2xsbWVudCwgcHJpbWFyeSAoJSBncm9zcynvvJpTRS5QUk0uRU5SUiBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TRS5QUk0uRU5SUildCgozLiAgU2Nob29sIGVucm9sbG1lbnQsIHNlY29uZGFyeSAoJSBncm9zcynvvJpTRS5TRUMuRU5SUiBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TRS5TRUMuRU5SUildCgo0LiAgU2Nob29sIGVucm9sbG1lbnQsIHRlcnRpYXJ5ICglIGdyb3NzKe+8mlNFLlRFUi5FTlJSIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NFLlRFUi5FTlJSKV0KCjUuICBNb3J0YWxpdHkgcmF0ZSwgdW5kZXItNSAocGVyIDEsMDAwIGxpdmUgYmlydGhzKe+8mlNILkRZTi5NT1JUIFtbTGlua10oaHR0cHM6Ly9kYXRhYmFuay53b3JsZGJhbmsub3JnL21ldGFkYXRhZ2xvc3Nhcnkvd29ybGQtZGV2ZWxvcG1lbnQtaW5kaWNhdG9ycy9zZXJpZXMvU0guRFlOLk1PUlQpXQoKNi4gIFNjaG9vbCBlbnJvbGxtZW50LCBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgKGdyb3NzKSwgZ2VuZGVyIHBhcml0eSBpbmRleCAoR1BJKe+8mlNFLkVOUi5QUlNDLkZNLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NFLkVOUi5QUlNDLkZNLlpTKV0KCjcuICBSYXRpbyBvZiBmZW1hbGUgdG8gbWFsZSBsYWJvciBmb3JjZSBwYXJ0aWNpcGF0aW9uIHJhdGUgKCUpIChtb2RlbGVkIElMTyBlc3RpbWF0ZSnvvJpTTC5UTEYuQ0FDVC5GTS5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TTC5UTEYuQ0FDVC5GTS5aUyldCgo4LiAgVW5lbXBsb3ltZW50LCBmZW1hbGUgKCUgb2YgZmVtYWxlIGxhYm9yIGZvcmNlKSAobW9kZWxlZCBJTE8gZXN0aW1hdGUp77yaU0wuVUVNLlRPVEwuRkUuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0wuVUVNLlRPVEwuRkUuWlMpXQoKOS4gIFVuZW1wbG95bWVudCwgbWFsZSAoJSBvZiBtYWxlIGxhYm9yIGZvcmNlKSAobW9kZWxlZCBJTE8gZXN0aW1hdGUp77yaU0wuVUVNLlRPVEwuTUEuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0wuVUVNLlRPVEwuTUEuWlMpXQoKMTAuIE5ldCBvZmZpY2lhbCBkZXZlbG9wbWVudCBhc3Npc3RhbmNlIGFuZCBvZmZpY2lhbCBhaWQgcmVjZWl2ZWQgKGN1cnJlbnQgVVNcJCkgRFQuT0RBLkFMTEQuQ0QgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRFQuT0RBLkFMTEQuQ0QpXQoKIyAxLiDlm73jga7mlZnogrLjgavplqLjgZnjgovmlK/lh7oKCj4g5qaC6KaB77ya5Zu95YaF57eP55Sf55Sj77yIR0RQ77yJ44Gr5a++44GZ44KL44CB5Zu944Gu5pWZ6IKy44Gr6Zai44GZ44KL5pSv5Ye677yIR292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24sIHRvdGFsICglIG9mIEdEUCnvvInjga7jg4fjg7zjgr/jga7liIbmnpDjgpLooYzjgYYKCiMjIOODh+ODvOOCvwoKR292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24sIHRvdGFsICglIG9mIEdEUCnvvJpTRS5YUEQuVE9UTC5HRC5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TRS5YUEQuVE9UTC5HRC5aUyldCgojIyMg44OH44O844K/44Gu5Y+W5b6XCgojIyMjIOa6luWCmQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgpXREkg44OR44OD44Kx44O844K444KS5L2/44Gj44Gm44CB55u05o6l44OH44O844K/44KS44OA44Km44Oz44Ot44O844OJ44GX44CB5aSJ5pWw5ZCN44KS44CBYGVkX2V4cGAg44Gr5oyH5a6a44CCCgpgYGB7ciBldmFsID0gRkFMU0V9CmRmX2VkX2V4cCA8LSBXREkoaW5kaWNhdG9yID0gYyhlZF9leHAgPSAiU0UuWFBELlRPVEwuR0QuWlMiKSkKYGBgCgpgYGB7ciBldmFsID0gRkFMU0V9CndyaXRlX2NzdihkZl9lZF9leHAsICJkYXRhL2VkX2V4cC5jc3YiKQpgYGAKCmBgYHtyfQpkZl9lZF9leHAgPC0gcmVhZF9jc3YoImRhdGEvZWRfZXhwLmNzdiIpCmBgYAoKIyMjIOODh+ODvOOCv+OBrueiuuiqjQoKYGBge3J9CmRmX2VkX2V4cApgYGAKCmBgYHtyfQpzdHIoZGZfZWRfZXhwKQpgYGAKCmBgYHtyfQpSRUdJT04gPC0gYygiMUEiLCAiMVciLCAiNEUiLCAiN0UiLCAiOFMiLCAiQjgiLCAiRVUiLCAiRjEiLCAiT0UiLCAiUzEiLCAKIlMyIiwgIlMzIiwgIlM0IiwgIlQyIiwgIlQzIiwgIlQ0IiwgIlQ1IiwgIlQ2IiwgIlQ3IiwgIlYxIiwgIlYyIiwgCiJWMyIsICJWNCIsICJYQyIsICJYRCIsICJYRSIsICJYRiIsICJYRyIsICJYSCIsICJYSSIsICJYSiIsICJYTCIsIAoiWE0iLCAiWE4iLCAiWE8iLCAiWFAiLCAiWFEiLCAiWFQiLCAiWFUiLCAiWFkiLCAiWjQiLCAiWjciLCAiWkYiLCAKIlpHIiwgIlpIIiwgIlpJIiwgIlpKIiwgIlpRIiwgIlpUIikKYGBgCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihpc28yYyAlaW4lIFJFR0lPTikgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCiMjIyDliIbmnpDjgZnjgovlm73jga7jg6rjgrnjg4gKCiMjIyMgKirljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58qKiBUaGUgU291dGhlcm4gQWZyaWNhbiBDdXN0b21zIFVuaW9uIChTQUNVKQoKYGBge3J9ClNPVVRIX0FGUklDQV9GSVZFIDwtIGMoIlNvdXRoIEFmcmljYSIsICJOYW1pYmlhIiwgIkVzd2F0aW5pIiwgIkJvdHN3YW5hIiwgIkxlc290aG8iKQpgYGAKCiMjIyMg44Op44OG44Oz44Ki44Oh44Oq44Kr44Gn44K444OL5oyH5pWw44GM5aSn44GN44GE77yU44Kr5Zu9CgpgYGB7cn0KQ0hPU0VOX0NPVU5UUklFUyA8LSBjKCJTdXJpbmFtZSIsICJCZWxpemUiLCAiQnJhemlsIiwgIkNvbG9tYmlhIikKYGBgCgojIyDliIbmnpAKCiMjIyAxLiDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7mo5LjgrDjg6njg5UKCmBgYHtyfQpkZl9lZF9leHAgfD4gZHJvcF9uYShlZF9leHApIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIpKSArIGdlb21fYmFyKCkKYGBgCgojIyDoppbopprljJYKCiMjIyAyLiDml6XmnKzjga7mlZnogrLosrvvvIglIG9mIEdEUO+8iQoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiAKICBkcm9wX25hKGVkX2V4cCkgfD4gYXJyYW5nZShkZXNjKHllYXIpKQpgYGAKCiMjIyAzLiDntYzlubTlpInljJYKCiMjIyMgYS4g5pel5pysCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoeWVhciwgZWRfZXhwKSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICAxOTcw5bm05Luj44Gu5oCl5r+A44Gq5LiK5piH44CBMTk5MOW5tOOBlOOCjeOBruaApea/gOOBquePvuixoeOBr+OAgeS9leOBjOWOn+WboOOBquOBruOBoOOCjeOBhuOAggoKLSAgIDIwMTTlubTjgZTjgo3jgYvjgonmuJvlsJHjgIEyMDE45bm044GU44KN44GL44KJ5aKX5Yqg44CBMjAyMOW5tOOBi+OCiTIwMjHlubTjga/muJvlsJHjgIIKCiMjIyMgYi4g5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoeWVhciwgZWRfZXhwKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYShlZF9leHApIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBlZF9leHApKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOW5s+Wdh+OBp+imi+OCi+OBqOOAgeS4iuaYh+OBl+OBpuOBjeOBpuOBiuOCiuOAgTclIOeoi+W6puOBqOOBhOOBhuWkp+OBjeOBquWJsuWQiOOBq+OBquOBo+OBpuOBhOOCi+OAggoKIyMjIyBjLiDjg6njg4bjg7PjgqLjg6Hjg6rjgqvvvJTjgqvlm70KCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKGVkX2V4cCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGVkX2V4cCkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkKYGBgCgoqKuWPguiAg++8muW5s+Wdh+eahOOBquWApOOCkuabsue3muOBp+ihqOOBmeOBk+OBqOOCguWPr+iDveOBp+OBmeOAgmxvZXNzIOOCkuS9v+OBhuOBqOa7keOCieOBi+OBquabsue3muOBp+i/keS8vOOBl+OBpuOBj+OCjOOBvuOBmeOAgioqCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYShlZF9leHApIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBlZF9leHApKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKIyMjIOWIhuW4gwoK44OH44O844K/44Gu5pWw44GL44KJ44CB44G+44Ga44Gv44CBMjAyMOW5tOOBq+OBpOOBhOOBpuimi+OBpuOBv+OCi+OAggoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoZWRfZXhwKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpCmBgYAoKKirlj4LogIPvvJoqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIApgYGAKCioq5Y+C6ICD77ya5pel5pys44GoKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CkpQIDwtIDMuNDE2OTgxClNBRiA8LSBkZl9lZF9leHAgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gcHVsbChlZF9leHApCmRmX2VkX2V4cCB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdCgpICsgZ2VvbV9oaXN0b2dyYW0oYWVzKGVkX2V4cCksIGJpbndpZHRoID0gMSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IFNBRiwgY29sID0gInJlZCIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gSlAsIGNvbCA9ICJibHVlIikgK2xhYnModGl0bGUgPSAiMjAyMOW5tOOBruaVmeiCsuiyu+OBruWvvkdEUOeZvuWIhueOhyIsIHN1YnRpdGxlID0gIuaXpeacrO+8mumdkuOAgVNBQ1XvvJrotaQiKQpgYGAKCiMjIyDjg4fjg7zjgr/jgYzljYHliIbjgYLjgovmnIDov5Hjga7lubTjga7lgKTjga4xMOOCq+WbveOBruWApOOBruajkuOCsOODqeODlQoKIyMjIyBhLiDlgKTjgYzlpKfjgY3jgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYShlZF9leHApIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSl8PgogIGFycmFuZ2UoZGVzYyhlZF9leHApKSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZW9yZGVyKGNvdW50cnksIGVkX2V4cCksIGVkX2V4cCkpICsgZ2VvbV9jb2woKSArIAogIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAiVG9wIDEwIENvdW50cmllcyIsIHggPSAiY291bnRyeSIsIHkgPSAiR292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24sIHRvdGFsICglIG9mIEdEUCkiKQpgYGAKCiMjIyMgYi4g5YCk44GM5bCP44GV44GE5pa544GL44KJCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEoZWRfZXhwKSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKGVkX2V4cCkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmV2KGZjdF9yZW9yZGVyKGNvdW50cnksIGVkX2V4cCkpLCBlZF9leHApKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIkxvd2VzdCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gIkdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uLCB0b3RhbCAoJSBvZiBHRFApIikKYGBgCgojIDIuIOWIneetieWtpuagoeWwseWtpueOhwoKIyMjIOODh+ODvOOCvwoKLSAgIFNjaG9vbCBlbnJvbGxtZW50LCBwcmltYXJ5ICglIGdyb3NzKe+8mlNFLlBSTS5FTlJSIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NFLlBSTS5FTlJSKV0KCiMjIyDjg4fjg7zjgr/jga7lj5blvpcKCiMjIyMg5rqW5YKZCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCldESSDjg5Hjg4PjgrHjg7zjgrjjgpLkvb/jgaPjgabjgIHnm7TmjqXjg4fjg7zjgr/jgpLjg4Djgqbjg7Pjg63jg7zjg4njgZfjgIHlpInmlbDlkI3jgpLjgIFgZWRfZXhwYCDjgavmjIflrprjgIIKCmBgYHtyIGV2YWwgPSBGQUxTRX0KZGZfcHJpbWFyeSA8LSBXREkoaW5kaWNhdG9yID0gYyhwcmltYXJ5ID0gIlNFLlBSTS5FTlJSIikpCmBgYAoKYGBge3IgZXZhbCA9IEZBTFNFfQp3cml0ZV9jc3YoZGZfcHJpbWFyeSwgImRhdGEvcHJpbWFyeS5jc3YiKQpgYGAKCmBgYHtyfQpkZl9wcmltYXJ5IDwtIHJlYWRfY3N2KCJkYXRhL3ByaW1hcnkuY3N2IikKYGBgCgojIyMg44OH44O844K/44Gu56K66KqNCgpgYGB7cn0KZGZfcHJpbWFyeQpgYGAKCmBgYHtyfQpzdHIoZGZfcHJpbWFyeSkKYGBgCgpgYGB7cn0KUkVHSU9OIDwtIGMoIjFBIiwgIjFXIiwgIjRFIiwgIjdFIiwgIjhTIiwgIkI4IiwgIkVVIiwgIkYxIiwgIk9FIiwgIlMxIiwgCiJTMiIsICJTMyIsICJTNCIsICJUMiIsICJUMyIsICJUNCIsICJUNSIsICJUNiIsICJUNyIsICJWMSIsICJWMiIsIAoiVjMiLCAiVjQiLCAiWEMiLCAiWEQiLCAiWEUiLCAiWEYiLCAiWEciLCAiWEgiLCAiWEkiLCAiWEoiLCAiWEwiLCAKIlhNIiwgIlhOIiwgIlhPIiwgIlhQIiwgIlhRIiwgIlhUIiwgIlhVIiwgIlhZIiwgIlo0IiwgIlo3IiwgIlpGIiwgCiJaRyIsICJaSCIsICJaSSIsICJaSiIsICJaUSIsICJaVCIpCmBgYAoKYGBge3J9CmRmX3ByaW1hcnkgfD4gZmlsdGVyKGlzbzJjICVpbiUgUkVHSU9OKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgojIyMg5YiG5p6Q44GZ44KL5Zu944Gu44Oq44K544OICgojIyMjICoq5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufKiogVGhlIFNvdXRoZXJuIEFmcmljYW4gQ3VzdG9tcyBVbmlvbiAoU0FDVSkKCmBgYHtyfQpTT1VUSF9BRlJJQ0FfRklWRSA8LSBjKCJTb3V0aCBBZnJpY2EiLCAiTmFtaWJpYSIsICJFc3dhdGluaSIsICJCb3Rzd2FuYSIsICJMZXNvdGhvIikKYGBgCgojIyMjIOODqeODhuODs+OCouODoeODquOCq+OBp+OCuOODi+aMh+aVsOOBjOWkp+OBjeOBhO+8lOOCq+WbvQoKYGBge3J9CkNIT1NFTl9DT1VOVFJJRVMgPC0gYygiU3VyaW5hbWUiLCAiQmVsaXplIiwgIkJyYXppbCIsICJDb2xvbWJpYSIpCmBgYAoKIyMg5YiG5p6QCgojIyMgMS4g5ZCE5bm05q+O44Gu44OH44O844K/44Gu5pWw44Gu5qOS44Kw44Op44OVCgpgYGB7cn0KZGZfcHJpbWFyeSB8PiBkcm9wX25hKHByaW1hcnkpIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIpKSArIGdlb21fYmFyKCkKYGBgCgojIyDoppbopprljJYKCiMjIyAyLiDml6XmnKzjga7liJ3nrYnlrabmoKHlsLHlrabnjocKCmBgYHtyfQpkZl9wcmltYXJ5IHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IAogIGRyb3BfbmEocHJpbWFyeSkgfD4gYXJyYW5nZShkZXNjKHllYXIpKQpgYGAKCiMjIyAzLiDntYzlubTlpInljJYKCiMjIyMgYS4g5pel5pysCgpgYGB7cn0KZGZfcHJpbWFyeSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiBkcm9wX25hKHByaW1hcnkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBwcmltYXJ5KSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICAxOTcw5bm05Luj44Gu5oCl5r+A44Gq5LiK5piH44O75LiL6ZmN44CBMTk4MOW5tOOBlOOCjeOBi+OCieS4iuaYh+OAgeOBneOBk+OBp+OAgTEwMCDjgpLotoXjgYjjgabjgYTjgovjgIIxOTk15bm044GU44KN44GL44KJ44Gv44CB5rib5bCR44GX44Gm44GE44KL44GM44CB44G+44Gg44CBMTAw5Lul5LiK44Gn44GC44KL44CC5L2V44GM5Y6f5Zug44Gq44Gu44Gg44KN44GG44CCCgojIyMjIGIuIOWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnwoKYGBge3J9CmRmX3ByaW1hcnkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYShwcmltYXJ5KSB8PgogIGdncGxvdChhZXMoeWVhciwgcHJpbWFyeSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkKYGBgCgoqKuWPguiAg++8muW5s+Wdh+eahOOBquWApOOCkuabsue3muOBp+ihqOOBmeOBk+OBqOOCguWPr+iDveOBp+OBmeOAgmxvZXNzIOOCkuS9v+OBhuOBqOa7keOCieOBi+OBquabsue3muOBp+i/keS8vOOBl+OBpuOBj+OCjOOBvuOBmeOAgioqCgpgYGB7cn0KZGZfcHJpbWFyeSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKHByaW1hcnkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBwcmltYXJ5KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICAxMDDjgpLotoXjgYjjgabjgYTjgovjgIIKCiMjIyMgYy4g44Op44OG44Oz44Ki44Oh44Oq44Kr77yU44Kr5Zu9CgpgYGB7cn0KZGZfcHJpbWFyeSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENIT1NFTl9DT1VOVFJJRVMpIHw+IGRyb3BfbmEocHJpbWFyeSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHByaW1hcnkpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX3ByaW1hcnkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKHByaW1hcnkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBwcmltYXJ5KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCiMjIyDliIbluIMKCuODh+ODvOOCv+OBruaVsOOBi+OCieOAgeOBvuOBmuOBr+OAgTIwMjDlubTjgavjgaTjgYTjgabopovjgabjgb/jgovjgIIKCmBgYHtyfQpkZl9wcmltYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcighKGNvdW50cnkgJWluJSBSRUdJT04pKXw+CiAgZHJvcF9uYShwcmltYXJ5KSB8PgogIGdncGxvdChhZXMocHJpbWFyeSkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1KQpgYGAKCioq5Y+C6ICD77yaKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CmRmX3ByaW1hcnkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgCmBgYAoKKirlj4LogIPvvJrml6XmnKzjgagqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KSlAgPC0gMTAyLjczNjgzClNBRiA8LSBkZl9wcmltYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IHB1bGwocHJpbWFyeSkKZGZfcHJpbWFyeSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEocHJpbWFyeSkgfD4KICBnZ3Bsb3QoKSArIGdlb21faGlzdG9ncmFtKGFlcyhwcmltYXJ5KSwgYmlud2lkdGggPSA1KSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gU0FGLCBjb2wgPSAicmVkIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBKUCwgY29sID0gImJsdWUiKSArbGFicyh0aXRsZSA9ICIyMDIw5bm044Gu5Yid562J5a2m5qCh5bCx5a2m546HIiwgc3VidGl0bGUgPSAi5pel5pys77ya6Z2S44CBU0FDVe+8mui1pCIpCmBgYAoKIyMjIOODh+ODvOOCv+OBjOWNgeWIhuOBguOCi+acgOi/keOBruW5tOOBruWApOOBrjEw44Kr5Zu944Gu5YCk44Gu5qOS44Kw44Op44OVCgojIyMjIGEuIOWApOOBjOWkp+OBjeOBhOaWueOBi+OCiQoKYGBge3J9CmRmX3ByaW1hcnkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYShwcmltYXJ5KSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKGRlc2MocHJpbWFyeSkpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3Jlb3JkZXIoY291bnRyeSwgcHJpbWFyeSksIHByaW1hcnkpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIlRvcCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gIuWIneetieWtpuagoeWwseWtpueOhyIpCmBgYAoKIyMjIyBiLiDlgKTjgYzlsI/jgZXjgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9wcmltYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEocHJpbWFyeSkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShwcmltYXJ5KSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZXYoZmN0X3Jlb3JkZXIoY291bnRyeSwgcHJpbWFyeSkpLCBwcmltYXJ5KSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJMb3dlc3QgMTAgQ291bnRyaWVzIiwgeCA9ICJjb3VudHJ5IiwgeSA9ICLliJ3nrYnlrabmoKHlsLHlrabnjociKQpgYGAKCiMgMy4g5Lit562J5a2m5qCh5bCx5a2m546HCgojIyMg44OH44O844K/CgotICAgU2Nob29sIGVucm9sbG1lbnQsIHNlY29uZGFyeSAoJSBncm9zcynvvJpTRS5TRUMuRU5SUiBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TRS5TRUMuRU5SUildCgojIyMg44OH44O844K/44Gu5Y+W5b6XCgojIyMjIOa6luWCmQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgpXREkg44OR44OD44Kx44O844K444KS5L2/44Gj44Gm44CB55u05o6l44OH44O844K/44KS44OA44Km44Oz44Ot44O844OJ44GX44CB5aSJ5pWw5ZCN44KS44CBYGVkX2V4cGAg44Gr5oyH5a6a44CCCgpgYGB7ciBldmFsID0gRkFMU0V9CmRmX3NlY29uZGFyeSA8LSBXREkoaW5kaWNhdG9yID0gYyhzZWNvbmRhcnkgPSAiU0UuU0VDLkVOUlIiKSkKYGBgCgpgYGB7ciBldmFsID0gRkFMU0V9CndyaXRlX2NzdihkZl9zZWNvbmRhcnksICJkYXRhL3NlY29uZGFyeS5jc3YiKQpgYGAKCmBgYHtyfQpkZl9zZWNvbmRhcnkgPC0gcmVhZF9jc3YoImRhdGEvc2Vjb25kYXJ5LmNzdiIpCmBgYAoKIyMjIOODh+ODvOOCv+OBrueiuuiqjQoKYGBge3J9CmRmX3NlY29uZGFyeQpgYGAKCmBgYHtyfQpzdHIoZGZfc2Vjb25kYXJ5KQpgYGAKCmBgYHtyfQpSRUdJT04gPC0gYygiMUEiLCAiMVciLCAiNEUiLCAiN0UiLCAiOFMiLCAiQjgiLCAiRVUiLCAiRjEiLCAiT0UiLCAiUzEiLCAKIlMyIiwgIlMzIiwgIlM0IiwgIlQyIiwgIlQzIiwgIlQ0IiwgIlQ1IiwgIlQ2IiwgIlQ3IiwgIlYxIiwgIlYyIiwgCiJWMyIsICJWNCIsICJYQyIsICJYRCIsICJYRSIsICJYRiIsICJYRyIsICJYSCIsICJYSSIsICJYSiIsICJYTCIsIAoiWE0iLCAiWE4iLCAiWE8iLCAiWFAiLCAiWFEiLCAiWFQiLCAiWFUiLCAiWFkiLCAiWjQiLCAiWjciLCAiWkYiLCAKIlpHIiwgIlpIIiwgIlpJIiwgIlpKIiwgIlpRIiwgIlpUIikKYGBgCgpgYGB7cn0KZGZfc2Vjb25kYXJ5IHw+IGZpbHRlcihpc28yYyAlaW4lIFJFR0lPTikgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKYGBge3J9CmRmX3NlY29uZGFyeSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCiMjIyDliIbmnpDjgZnjgovlm73jga7jg6rjgrnjg4gKCiMjIyMgKirljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58qKiBUaGUgU291dGhlcm4gQWZyaWNhbiBDdXN0b21zIFVuaW9uIChTQUNVKQoKYGBge3J9ClNPVVRIX0FGUklDQV9GSVZFIDwtIGMoIlNvdXRoIEFmcmljYSIsICJOYW1pYmlhIiwgIkVzd2F0aW5pIiwgIkJvdHN3YW5hIiwgIkxlc290aG8iKQpgYGAKCiMjIyMg44Op44OG44Oz44Ki44Oh44Oq44Kr44Gn44K444OL5oyH5pWw44GM5aSn44GN44GE77yU44Kr5Zu9CgpgYGB7cn0KQ0hPU0VOX0NPVU5UUklFUyA8LSBjKCJTdXJpbmFtZSIsICJCZWxpemUiLCAiQnJhemlsIiwgIkNvbG9tYmlhIikKYGBgCgojIyDliIbmnpAKCiMjIyAxLiDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7mo5LjgrDjg6njg5UKCmBgYHtyfQpkZl9zZWNvbmRhcnkgfD4gZHJvcF9uYShzZWNvbmRhcnkpIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIpKSArIGdlb21fYmFyKCkKYGBgCgojIyDoppbopprljJYKCiMjIyAyLiDml6XmnKzjga7kuK3nrYnlrabmoKHlsLHlrabnjocKCmBgYHtyfQpkZl9zZWNvbmRhcnkgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gCiAgZHJvcF9uYShzZWNvbmRhcnkpIHw+IGFycmFuZ2UoZGVzYyh5ZWFyKSkKYGBgCgojIyMgMy4g57WM5bm05aSJ5YyWCgojIyMjIGEuIOaXpeacrAoKYGBge3J9CmRmX3NlY29uZGFyeSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiBkcm9wX25hKHNlY29uZGFyeSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHNlY29uZGFyeSkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgMjAwMOW5tOOBlOOCjeOBi+OCiea4m+WwkeOAgeOBneOBruW+jOOCguWkieWMluOBjOOBguOCi+OAguS9leOBjOWOn+WboOOBquOBruOBoOOCjeOBhuOAggoKIyMjIyBiLiDljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58KCmBgYHtyfQpkZl9zZWNvbmRhcnkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYShzZWNvbmRhcnkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBzZWNvbmRhcnkpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX3NlY29uZGFyeSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKHNlY29uZGFyeSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHNlY29uZGFyeSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAg5bmz5Z2H44Gn6KaL44KL44Go44CB5LiA5a6a44GX44Gm5LiK5piH44GX44Gm44GE44KL44CCCgojIyMjIGMuIOODqeODhuODs+OCouODoeODquOCq++8lOOCq+WbvQoKYGBge3J9CmRmX3NlY29uZGFyeSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENIT1NFTl9DT1VOVFJJRVMpIHw+IGRyb3BfbmEoc2Vjb25kYXJ5KSB8PgogIGdncGxvdChhZXMoeWVhciwgc2Vjb25kYXJ5KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9zZWNvbmRhcnkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKHNlY29uZGFyeSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHNlY29uZGFyeSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgojIyMg5YiG5biDCgrjg4fjg7zjgr/jga7mlbDjgYvjgonjgIHjgb7jgZrjga/jgIEyMDIw5bm044Gr44Gk44GE44Gm6KaL44Gm44G/44KL44CCCgpgYGB7cn0KZGZfc2Vjb25kYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcighKGNvdW50cnkgJWluJSBSRUdJT04pKXw+CiAgZHJvcF9uYShzZWNvbmRhcnkpIHw+CiAgZ2dwbG90KGFlcyhzZWNvbmRhcnkpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTApCmBgYAoKKirlj4LogIPvvJoqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KZGZfc2Vjb25kYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIApgYGAKCioq5Y+C6ICD77ya5pel5pys44GoKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CkpQIDwtIDEwMi44NDQ4MApTQUYgPC0gZGZfc2Vjb25kYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IHB1bGwoc2Vjb25kYXJ5KQpkZl9zZWNvbmRhcnkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKHNlY29uZGFyeSkgfD4KICBnZ3Bsb3QoKSArIGdlb21faGlzdG9ncmFtKGFlcyhzZWNvbmRhcnkpLCBiaW53aWR0aCA9IDEwKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gU0FGLCBjb2wgPSAicmVkIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBKUCwgY29sID0gImJsdWUiKSArbGFicyh0aXRsZSA9ICIyMDIw5bm044Gu5Lit562J5a2m5qCh5bCx5a2m546HIiwgc3VidGl0bGUgPSAi5pel5pys77ya6Z2S44CBU0FDVe+8mui1pCIpCmBgYAoKIyMjIOODh+ODvOOCv+OBjOWNgeWIhuOBguOCi+acgOi/keOBruW5tOOBruWApOOBrjEw44Kr5Zu944Gu5YCk44Gu5qOS44Kw44Op44OVCgojIyMjIGEuIOWApOOBjOWkp+OBjeOBhOaWueOBi+OCiQoKYGBge3J9CmRmX3NlY29uZGFyeSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKHNlY29uZGFyeSkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShkZXNjKHNlY29uZGFyeSkpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3Jlb3JkZXIoY291bnRyeSwgc2Vjb25kYXJ5KSwgc2Vjb25kYXJ5KSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJUb3AgMTAgQ291bnRyaWVzIiwgeCA9ICJjb3VudHJ5IiwgeSA9ICJzZWNvbmRhcnkgc2Nob29sIGVucm9sbG1lbnQiKQpgYGAKCiMjIyMgYi4g5YCk44GM5bCP44GV44GE5pa544GL44KJCgpgYGB7cn0KZGZfc2Vjb25kYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEoc2Vjb25kYXJ5KSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKHNlY29uZGFyeSkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmV2KGZjdF9yZW9yZGVyKGNvdW50cnksIHNlY29uZGFyeSkpLCBzZWNvbmRhcnkpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIkxvd2VzdCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gInNlY29uZGFyeSBzY2hvb2xsIGVucm9sbG1lbnQiKQpgYGAKCiMgNC4g5Lit562J5a2m5qCh5b6M44Gu5bCx5a2m546HCgojIyMg44OH44O844K/CgotICAgU2Nob29sIGVucm9sbG1lbnQsIHRlcnRpYXJ5ICglIGdyb3NzKe+8mlNFLlRFUi5FTlJSIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NFLlRFUi5FTlJSKV0KCiMjIyDjg4fjg7zjgr/jga7lj5blvpcKCiMjIyMg5rqW5YKZCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCldESSDjg5Hjg4PjgrHjg7zjgrjjgpLkvb/jgaPjgabjgIHnm7TmjqXjg4fjg7zjgr/jgpLjg4Djgqbjg7Pjg63jg7zjg4njgZfjgIHlpInmlbDlkI3jgpLjgIFgZWRfZXhwYCDjgavmjIflrprjgIIKCmBgYHtyIGV2YWwgPSBGQUxTRX0KZGZfdGVydGlhcnkgPC0gV0RJKGluZGljYXRvciA9IGModGVydGlhcnkgPSAiU0UuVEVSLkVOUlIiKSkKYGBgCgpgYGB7ciBldmFsID0gRkFMU0V9CndyaXRlX2NzdihkZl90ZXJ0aWFyeSwgImRhdGEvdGVydGlhcnkuY3N2IikKYGBgCgpgYGB7cn0KZGZfdGVydGlhcnkgPC0gcmVhZF9jc3YoImRhdGEvdGVydGlhcnkuY3N2IikKYGBgCgojIyMg44OH44O844K/44Gu56K66KqNCgpgYGB7cn0KZGZfdGVydGlhcnkKYGBgCgpgYGB7cn0Kc3RyKGRmX3RlcnRpYXJ5KQpgYGAKCmBgYHtyfQpSRUdJT04gPC0gYygiMUEiLCAiMVciLCAiNEUiLCAiN0UiLCAiOFMiLCAiQjgiLCAiRVUiLCAiRjEiLCAiT0UiLCAiUzEiLCAKIlMyIiwgIlMzIiwgIlM0IiwgIlQyIiwgIlQzIiwgIlQ0IiwgIlQ1IiwgIlQ2IiwgIlQ3IiwgIlYxIiwgIlYyIiwgCiJWMyIsICJWNCIsICJYQyIsICJYRCIsICJYRSIsICJYRiIsICJYRyIsICJYSCIsICJYSSIsICJYSiIsICJYTCIsIAoiWE0iLCAiWE4iLCAiWE8iLCAiWFAiLCAiWFEiLCAiWFQiLCAiWFUiLCAiWFkiLCAiWjQiLCAiWjciLCAiWkYiLCAKIlpHIiwgIlpIIiwgIlpJIiwgIlpKIiwgIlpRIiwgIlpUIikKYGBgCgpgYGB7cn0KZGZfdGVydGlhcnkgfD4gZmlsdGVyKGlzbzJjICVpbiUgUkVHSU9OKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgpgYGB7cn0KZGZfdGVydGlhcnkgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgojIyMg5YiG5p6Q44GZ44KL5Zu944Gu44Oq44K544OICgojIyMjICoq5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufKiogVGhlIFNvdXRoZXJuIEFmcmljYW4gQ3VzdG9tcyBVbmlvbiAoU0FDVSkKCmBgYHtyfQpTT1VUSF9BRlJJQ0FfRklWRSA8LSBjKCJTb3V0aCBBZnJpY2EiLCAiTmFtaWJpYSIsICJFc3dhdGluaSIsICJCb3Rzd2FuYSIsICJMZXNvdGhvIikKYGBgCgojIyMjIOODqeODhuODs+OCouODoeODquOCq+OBp+OCuOODi+aMh+aVsOOBjOWkp+OBjeOBhO+8lOOCq+WbvQoKYGBge3J9CkNIT1NFTl9DT1VOVFJJRVMgPC0gYygiU3VyaW5hbWUiLCAiQmVsaXplIiwgIkJyYXppbCIsICJDb2xvbWJpYSIpCmBgYAoKIyMg5YiG5p6QCgojIyMgMS4g5ZCE5bm05q+O44Gu44OH44O844K/44Gu5pWw44Gu5qOS44Kw44Op44OVCgpgYGB7cn0KZGZfdGVydGlhcnkgfD4gZHJvcF9uYSh0ZXJ0aWFyeSkgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PgogIGdncGxvdChhZXMoeWVhcikpICsgZ2VvbV9iYXIoKQpgYGAKCiMjIOimluimmuWMlgoKIyMjIDIuIOaXpeacrOOBruaVmeiCsuiyu++8iCUgb2YgR0RQ77yJCgpgYGB7cn0KZGZfdGVydGlhcnkgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gCiAgZHJvcF9uYSh0ZXJ0aWFyeSkgfD4gYXJyYW5nZShkZXNjKHllYXIpKQpgYGAKCiMjIyAzLiDntYzlubTlpInljJYKCiMjIyMgYS4g5pel5pysCgpgYGB7cn0KZGZfdGVydGlhcnkgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gZHJvcF9uYSh0ZXJ0aWFyeSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHRlcnRpYXJ5KSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICAxOTcw5bm05Luj44Gu5oCl5r+A44Gq5LiK5piH44CBMTk5MOW5tOOBlOOCjeOBi+OCieOBvuOBn+Wil+WKoOOBr+OAgeS9leOBjOWOn+WboOOBquOBruOBoOOCjeOBhuOAggoKLSAgIOOBqeOBruOCiOOBhuOBq+OAgeS4reetieWtpuagoeW+jOOBq+OBpOOBhOOBpuWumuOCgeOBpuOBhOOCi+OBruOBoOOCjeOBhuOAggoKIyMjIyBiLiDljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58KCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKHRlcnRpYXJ5KSB8PgogIGdncGxvdChhZXMoeWVhciwgdGVydGlhcnkpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX3RlcnRpYXJ5IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEodGVydGlhcnkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB0ZXJ0aWFyeSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAg5bmz5Z2H44Gn6KaL44KL44Go44CB5LiK5piH44GX44Gm44GN44Gm44GK44KK44CBNyUg56iL5bqm44Go44GE44GG5aSn44GN44Gq5Ymy5ZCI44Gr44Gq44Gj44Gm44GE44KL44CCCgojIyMjIGMuIOODqeODhuODs+OCouODoeODquOCq++8lOOCq+WbvQoKYGBge3J9CmRmX3RlcnRpYXJ5IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYSh0ZXJ0aWFyeSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHRlcnRpYXJ5KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENIT1NFTl9DT1VOVFJJRVMpIHw+IGRyb3BfbmEodGVydGlhcnkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB0ZXJ0aWFyeSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgojIyMg5YiG5biDCgrjg4fjg7zjgr/jga7mlbDjgYvjgonjgIHjgb7jgZrjga/jgIEyMDIw5bm044Gr44Gk44GE44Gm6KaL44Gm44G/44KL44CCCgpgYGB7cn0KZGZfdGVydGlhcnkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKHRlcnRpYXJ5KSB8PgogIGdncGxvdChhZXModGVydGlhcnkpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTApCmBgYAoKKirlj4LogIPvvJoqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KZGZfdGVydGlhcnkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgCmBgYAoKKirlj4LogIPvvJrml6XmnKzjgagqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KSlAgPC0gNjIuMTM1ODQKU0FGIDwtIGRmX3RlcnRpYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IHB1bGwodGVydGlhcnkpCmRmX3RlcnRpYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcighKGNvdW50cnkgJWluJSBSRUdJT04pKXw+CiAgZHJvcF9uYSh0ZXJ0aWFyeSkgfD4KICBnZ3Bsb3QoKSArIGdlb21faGlzdG9ncmFtKGFlcyh0ZXJ0aWFyeSksIGJpbndpZHRoID0gMTApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBTQUYsIGNvbCA9ICJyZWQiKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IEpQLCBjb2wgPSAiYmx1ZSIpICtsYWJzKHRpdGxlID0gIjIwMjDlubTjga7kuK3nrYnlrabmoKHlvozjga7lsLHlrabnjociLCBzdWJ0aXRsZSA9ICLml6XmnKzvvJrpnZLjgIFTQUNV77ya6LWkIikKYGBgCgojIyMg44OH44O844K/44GM5Y2B5YiG44GC44KL5pyA6L+R44Gu5bm044Gu5YCk44GuMTDjgqvlm73jga7lgKTjga7mo5LjgrDjg6njg5UKCiMjIyMgYS4g5YCk44GM5aSn44GN44GE5pa544GL44KJCgpgYGB7cn0KZGZfdGVydGlhcnkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYSh0ZXJ0aWFyeSkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShkZXNjKHRlcnRpYXJ5KSkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmVvcmRlcihjb3VudHJ5LCB0ZXJ0aWFyeSksIHRlcnRpYXJ5KSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJUb3AgMTAgQ291bnRyaWVzIiwgeCA9ICJjb3VudHJ5IiwgeSA9ICJ0ZXJ0aWFyeSBzY2hvb2wgZW5yb2xsbWVudCIpCmBgYAoKIyMjIyBiLiDlgKTjgYzlsI/jgZXjgYTmlrnjgYvjgokKCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKHRlcnRpYXJ5KSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKHRlcnRpYXJ5KSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZXYoZmN0X3Jlb3JkZXIoY291bnRyeSwgdGVydGlhcnkpKSwgdGVydGlhcnkpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIkxvd2VzdCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gInRlcnRpYXJ5IHNjaG9vbCBlbnJvbGxtZW50IikKYGBgCgojIDUuIOS6lOats+acqua6gOOBruatu+S6oeeOhwoKIyMg44OH44O844K/CgotICAgTW9ydGFsaXR5IHJhdGUsIHVuZGVyLTUgKHBlciAxLDAwMCBsaXZlIGJpcnRocynvvJpTSC5EWU4uTU9SVCBbW0xpbmtdKGh0dHBzOi8vZGF0YWJhbmsud29ybGRiYW5rLm9yZy9tZXRhZGF0YWdsb3NzYXJ5L3dvcmxkLWRldmVsb3BtZW50LWluZGljYXRvcnMvc2VyaWVzL1NILkRZTi5NT1JUKV0KCiMjIyDjg4fjg7zjgr/jga7lj5blvpcKCiMjIyMg5rqW5YKZCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCldESSDjg5Hjg4PjgrHjg7zjgrjjgpLkvb/jgaPjgabjgIHnm7TmjqXjg4fjg7zjgr/jgpLjg4Djgqbjg7Pjg63jg7zjg4njgZfjgIHlpInmlbDlkI3jgpLjgIFgZWRfZXhwYCDjgavmjIflrprjgIIKCmBgYHtyIGV2YWwgPSBGQUxTRX0KZGZfdW5kZXI1IDwtIFdESShpbmRpY2F0b3IgPSBjKHVuZGVyNSA9ICJTSC5EWU4uTU9SVCIpKQpgYGAKCmBgYHtyIGV2YWwgPSBGQUxTRX0Kd3JpdGVfY3N2KGRmX3VuZGVyNSwgImRhdGEvdW5kZXI1LmNzdiIpCmBgYAoKYGBge3J9CmRmX3VuZGVyNSA8LSByZWFkX2NzdigiZGF0YS91bmRlcjUuY3N2IikKYGBgCgojIyMg44OH44O844K/44Gu56K66KqNCgpgYGB7cn0KZGZfdW5kZXI1CmBgYAoKYGBge3J9CnN0cihkZl91bmRlcjUpCmBgYAoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI3RSIsICI4UyIsICJCOCIsICJFVSIsICJGMSIsICJPRSIsICJTMSIsIAoiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAKIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgCiJYTSIsICJYTiIsICJYTyIsICJYUCIsICJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaRiIsIAoiWkciLCAiWkgiLCAiWkkiLCAiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCmBgYHtyfQpkZl91bmRlcjUgfD4gZmlsdGVyKGlzbzJjICVpbiUgUkVHSU9OKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgpgYGB7cn0KZGZfdW5kZXI1IHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKIyMjIOWIhuaekOOBmeOCi+WbveOBruODquOCueODiAoKIyMjIyAqKuWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnyoqIFRoZSBTb3V0aGVybiBBZnJpY2FuIEN1c3RvbXMgVW5pb24gKFNBQ1UpCgpgYGB7cn0KU09VVEhfQUZSSUNBX0ZJVkUgPC0gYygiU291dGggQWZyaWNhIiwgIk5hbWliaWEiLCAiRXN3YXRpbmkiLCAiQm90c3dhbmEiLCAiTGVzb3RobyIpCmBgYAoKIyMjIyDjg6njg4bjg7PjgqLjg6Hjg6rjgqvjgafjgrjjg4vmjIfmlbDjgYzlpKfjgY3jgYTvvJTjgqvlm70KCmBgYHtyfQpDSE9TRU5fQ09VTlRSSUVTIDwtIGMoIlN1cmluYW1lIiwgIkJlbGl6ZSIsICJCcmF6aWwiLCAiQ29sb21iaWEiKQpgYGAKCiMjIOWIhuaekAoKIyMjIDEuIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoKYGBge3J9CmRmX3VuZGVyNSB8PiBkcm9wX25hKHVuZGVyNSkgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PgogIGdncGxvdChhZXMoeWVhcikpICsgZ2VvbV9iYXIoKQpgYGAKCiMjIOimluimmuWMlgoKIyMjIDIuIOS6lOats+acqua6gOatu+S6oeeOh++8iDEwMDDkurrjgYLjgZ/jgorvvIkKCmBgYHtyfQpkZl91bmRlcjUgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gCiAgZHJvcF9uYSh1bmRlcjUpIHw+IGFycmFuZ2UoZGVzYyh5ZWFyKSkKYGBgCgojIyMgMy4g57WM5bm05aSJ5YyWCgojIyMjIGEuIOaXpeacrAoKYGBge3J9CmRmX3VuZGVyNSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiBkcm9wX25hKHVuZGVyNSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHVuZGVyNSkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAg57aZ57aa55qE44Gr5rib5bCR44GX44Gm44GE44KL44CCCgotICAgMTk2MOW5tOOBlOOCjeOBrzQwJSDjgajjgYTjgYbjgZPjgajjga/jgIExOTUw5bm044GU44KN44Gv44CBNTAlIOOBkOOCieOBhOOBoOOBo+OBn+OBruOBoOOCjeOBhuOBi+OAggoKIyMjIyBiLiDljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58KCmBgYHtyfQpkZl91bmRlcjUgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYSh1bmRlcjUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB1bmRlcjUpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX3VuZGVyNSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKHVuZGVyNSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHVuZGVyNSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgMjAwMOW5tOOBmeOBjuOBq+S4iuaYh+OBl+OBpuOBhOOCi+OBjOOAgeOBneOCjOS7peWkluOBr+OAgea4m+WwkeOBl+OBpuOBhOOCi+OAggotICAg57Sb5LqJ44Gg44KN44GG44GL44CCCgojIyMjIGMuIOODqeODhuODs+OCouODoeODquOCq++8lOOCq+WbvQoKYGBge3J9CmRmX3VuZGVyNSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENIT1NFTl9DT1VOVFJJRVMpIHw+IGRyb3BfbmEodW5kZXI1KSB8PgogIGdncGxvdChhZXMoeWVhciwgdW5kZXI1KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl91bmRlcjUgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKHVuZGVyNSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHVuZGVyNSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgojIyMg5YiG5biDCgrjg4fjg7zjgr/jga7mlbDjgYvjgonjgIHjgb7jgZrjga/jgIEyMDIw5bm044Gr44Gk44GE44Gm6KaL44Gm44G/44KL44CCCgpgYGB7cn0KZGZfdW5kZXI1IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcighKGNvdW50cnkgJWluJSBSRUdJT04pKXw+CiAgZHJvcF9uYSh1bmRlcjUpIHw+CiAgZ2dwbG90KGFlcyh1bmRlcjUpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTApCmBgYAoKKirlj4LogIPvvJoqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KZGZfdW5kZXI1IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIApgYGAKCioq5Y+C6ICD77ya5pel5pys44GoKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CkpQIDwtIDIuNApTQUYgPC0gZGZfdW5kZXI1IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IHB1bGwodW5kZXI1KQpkZl91bmRlcjUgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKHVuZGVyNSkgfD4KICBnZ3Bsb3QoKSArIGdlb21faGlzdG9ncmFtKGFlcyh1bmRlcjUpLCBiaW53aWR0aCA9IDEwKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gU0FGLCBjb2wgPSAicmVkIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBKUCwgY29sID0gImJsdWUiKSArbGFicyh0aXRsZSA9ICLkupTmrbPmnKrmuoDjga7mrbvkuqHnjofvvIgxMDAw5Lq644GC44Gf44KK77yJIiwgc3VidGl0bGUgPSAi5pel5pys77ya6Z2S44CBU0FDVe+8mui1pCIpCmBgYAoKIyMjIOODh+ODvOOCv+OBjOWNgeWIhuOBguOCi+acgOi/keOBruW5tOOBruWApOOBrjEw44Kr5Zu944Gu5YCk44Gu5qOS44Kw44Op44OVCgojIyMjIGEuIOWApOOBjOWkp+OBjeOBhOaWueOBi+OCiQoKYGBge3J9CmRmX3VuZGVyNSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKHVuZGVyNSkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShkZXNjKHVuZGVyNSkpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3Jlb3JkZXIoY291bnRyeSwgdW5kZXI1KSwgdW5kZXI1KSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICLkupTmrbPmnKrmuoDjga7mrbvkuqHnjofvvIgxMDAw5Lq644GC44Gf44KK77yJIiwgeCA9ICJjb3VudHJ5IikKYGBgCgojIyMjIGIuIOWApOOBjOWwj+OBleOBhOaWueOBi+OCiQoKYGBge3J9CmRmX3VuZGVyNSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKHVuZGVyNSkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZSh1bmRlcjUpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3JldihmY3RfcmVvcmRlcihjb3VudHJ5LCB1bmRlcjUpKSwgdW5kZXI1KSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJMb3dlc3QgMTAgQ291bnRyaWVzIiwgeSA9ICJ1bmRlciA1IG1vcnRhbGl0eSIsIHggPSAiY291bnRyeSIpCmBgYAoKIyA2LiDliJ3nrYnkuK3nrYnlrabmoKHlsLHlrabnjofvvIjmgKflt67vvIkKCiMjIOODh+ODvOOCvwoKLSAgIFNjaG9vbCBlbnJvbGxtZW50LCBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgKGdyb3NzKSwgZ2VuZGVyIHBhcml0eSBpbmRleCAoR1BJKe+8mlNFLkVOUi5QUlNDLkZNLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NFLkVOUi5QUlNDLkZNLlpTKV0KCiMjIyDjg4fjg7zjgr/jga7lj5blvpcKCiMjIyMg5rqW5YKZCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCldESSDjg5Hjg4PjgrHjg7zjgrjjgpLkvb/jgaPjgabjgIHnm7TmjqXjg4fjg7zjgr/jgpLjg4Djgqbjg7Pjg63jg7zjg4njgZfjgIHlpInmlbDlkI3jgpLjgIFgZWRfZXhwYCDjgavmjIflrprjgIIKCmBgYHtyIGV2YWwgPSBGQUxTRX0KZGZfc2Nob29sX2dwaSA8LSBXREkoaW5kaWNhdG9yID0gYyhzY2hvb2xfZ3BpID0gIlNFLkVOUi5QUlNDLkZNLlpTIikpCmBgYAoKYGBge3IgZXZhbCA9IEZBTFNFfQp3cml0ZV9jc3YoZGZfc2Nob29sX2dwaSwgImRhdGEvc2Nob29sX2dwaS5jc3YiKQpgYGAKCmBgYHtyfQpkZl9zY2hvb2xfZ3BpIDwtIHJlYWRfY3N2KCJkYXRhL3NjaG9vbF9ncGkuY3N2IikKYGBgCgojIyMg44OH44O844K/44Gu56K66KqNCgpgYGB7cn0KZGZfc2Nob29sX2dwaQpgYGAKCmBgYHtyfQpzdHIoZGZfc2Nob29sX2dwaSkKYGBgCgpgYGB7cn0KUkVHSU9OIDwtIGMoIjFBIiwgIjFXIiwgIjRFIiwgIjdFIiwgIjhTIiwgIkI4IiwgIkVVIiwgIkYxIiwgIk9FIiwgIlMxIiwgCiJTMiIsICJTMyIsICJTNCIsICJUMiIsICJUMyIsICJUNCIsICJUNSIsICJUNiIsICJUNyIsICJWMSIsICJWMiIsIAoiVjMiLCAiVjQiLCAiWEMiLCAiWEQiLCAiWEUiLCAiWEYiLCAiWEciLCAiWEgiLCAiWEkiLCAiWEoiLCAiWEwiLCAKIlhNIiwgIlhOIiwgIlhPIiwgIlhQIiwgIlhRIiwgIlhUIiwgIlhVIiwgIlhZIiwgIlo0IiwgIlo3IiwgIlpGIiwgCiJaRyIsICJaSCIsICJaSSIsICJaSiIsICJaUSIsICJaVCIpCmBgYAoKYGBge3J9CmRmX3NjaG9vbF9ncGkgfD4gZmlsdGVyKGlzbzJjICVpbiUgUkVHSU9OKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgpgYGB7cn0KZGZfc2Nob29sX2dwaSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCiMjIyDliIbmnpDjgZnjgovlm73jga7jg6rjgrnjg4gKCiMjIyMgKirljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58qKiBUaGUgU291dGhlcm4gQWZyaWNhbiBDdXN0b21zIFVuaW9uIChTQUNVKQoKYGBge3J9ClNPVVRIX0FGUklDQV9GSVZFIDwtIGMoIlNvdXRoIEFmcmljYSIsICJOYW1pYmlhIiwgIkVzd2F0aW5pIiwgIkJvdHN3YW5hIiwgIkxlc290aG8iKQpgYGAKCiMjIyMg44Op44OG44Oz44Ki44Oh44Oq44Kr44Gn44K444OL5oyH5pWw44GM5aSn44GN44GE77yU44Kr5Zu9CgpgYGB7cn0KQ0hPU0VOX0NPVU5UUklFUyA8LSBjKCJTdXJpbmFtZSIsICJCZWxpemUiLCAiQnJhemlsIiwgIkNvbG9tYmlhIikKYGBgCgojIyDliIbmnpAKCiMjIyAxLiDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7mo5LjgrDjg6njg5UKCmBgYHtyfQpkZl9zY2hvb2xfZ3BpIHw+IGRyb3BfbmEoc2Nob29sX2dwaSkgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PgogIGdncGxvdChhZXMoeWVhcikpICsgZ2VvbV9iYXIoKQpgYGAKCiMjIOimluimmuWMlgoKIyMjIDIuIOaXpeacrOOBruWIneetieS4reetieWtpuagoeWwseWtpueOh+OBq+OBiuOBkeOCiyBHUEkKCmBgYHtyfQpkZl9zY2hvb2xfZ3BpIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IAogIGRyb3BfbmEoc2Nob29sX2dwaSkgfD4gYXJyYW5nZShkZXNjKHllYXIpKQpgYGAKCiMjIyAzLiDntYzlubTlpInljJYKCiMjIyMgYS4g5pel5pysCgpgYGB7cn0KZGZfc2Nob29sX2dwaSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiBkcm9wX25hKHNjaG9vbF9ncGkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBzY2hvb2xfZ3BpKSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICAxOTk15bm044GU44KN44G+44Gn44Gv5o+644KJ44GO44GM44GC44KL44CC44Gd44Gu44GC44Go44Gv44CB5LiL6ZmN44CCCgotICAg5beu44GM5bCP44GV44GE44Gu44Gn44CB44GC44G+44KK44CB5rCX44Gr44GZ44KL44Gu44Gv6YGp5YiH44Gn44Gv44Gq44GE44GL44KC44GX44KM44Gq44GE44CCCgojIyMjIGIuIOWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnwoKYGBge3J9CmRmX3NjaG9vbF9ncGkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gCiAgZHJvcF9uYShzY2hvb2xfZ3BpKSB8PgogIGdncGxvdChhZXMoeWVhciwgc2Nob29sX2dwaSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkKYGBgCgoqKuWPguiAg++8muW5s+Wdh+eahOOBquWApOOCkuabsue3muOBp+ihqOOBmeOBk+OBqOOCguWPr+iDveOBp+OBmeOAgmxvZXNzIOOCkuS9v+OBhuOBqOa7keOCieOBi+OBquabsue3muOBp+i/keS8vOOBl+OBpuOBj+OCjOOBvuOBmeOAgioqCgpgYGB7cn0KZGZfc2Nob29sX2dwaSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKHNjaG9vbF9ncGkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBzY2hvb2xfZ3BpKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICDjgobjgovjgoTjgYvjgavmuJvlsJHjgIIxLjAg44Gr6L+R44Gl44GE44Gm44GE44KL44CCCgojIyMjIGMuIOODqeODhuODs+OCouODoeODquOCq++8lOOCq+WbvQoKYGBge3J9CmRmX3NjaG9vbF9ncGkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKHNjaG9vbF9ncGkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBzY2hvb2xfZ3BpKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9zY2hvb2xfZ3BpIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYShzY2hvb2xfZ3BpKSB8PgogIGdncGxvdChhZXMoeWVhciwgc2Nob29sX2dwaSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgojIyMg5YiG5biDCgrjg4fjg7zjgr/jga7mlbDjgYvjgonjgIEyMDIw5bm044Gu44OH44O844K/44Gv5bCR44Gq44GE44Gu44Gn44CBMjAxOeW5tOOBq+OBpOOBhOOBpuimi+OBpuOBv+OCi+OAggoKYGBge3J9CmRmX3NjaG9vbF9ncGkgfD4gZmlsdGVyKHllYXIgPT0gMjAxOSkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKHNjaG9vbF9ncGkpIHw+CiAgZ2dwbG90KGFlcyhzY2hvb2xfZ3BpKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMDIpCmBgYAoKKirlj4LogIPvvJoqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KZGZfc2Nob29sX2dwaSB8PiBmaWx0ZXIoeWVhciA9PSAyMDE5KSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSAKYGBgCgoqKuWPguiAg++8muaXpeacrOOBqCoqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpKUCA8LSAxLjAwMzQxICMgbm8gcmVjZW50IGRhdGEgYWZ0ZXIgMjAxOQpTQUYgPC0gZGZfc2Nob29sX2dwaSB8PiBmaWx0ZXIoeWVhciA9PSAyMDE5KSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBwdWxsKHNjaG9vbF9ncGkpCmRmX3NjaG9vbF9ncGkgfD4gZmlsdGVyKHllYXIgPT0gMjAxOSkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKHNjaG9vbF9ncGkpIHw+CiAgZ2dwbG90KCkgKyBnZW9tX2hpc3RvZ3JhbShhZXMoc2Nob29sX2dwaSksIGJpbndpZHRoID0gMC4wMikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IFNBRiwgY29sID0gInJlZCIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gSlAsIGNvbCA9ICJibHVlIikgK2xhYnModGl0bGUgPSAiMjAxOeW5tOOBruWIneetieS4reetieWtpuagoeWwseWtpueOhyBHUEkiLCBzdWJ0aXRsZSA9ICLml6XmnKzvvJrpnZLjgIFTQUNV77ya6LWkIikKYGBgCgojIyMg44OH44O844K/44GM5Y2B5YiG44GC44KL5pyA6L+R44Gu5bm044Gu5YCk44GuMTDjgqvlm73jga7lgKTjga7mo5LjgrDjg6njg5UKCiMjIyMgYS4g5YCk44GM5aSn44GN44GE5pa544GL44KJCgpgYGB7cn0KZGZfc2Nob29sX2dwaSB8PiBmaWx0ZXIoeWVhciA9PSAyMDE5KSB8PiBkcm9wX25hKHNjaG9vbF9ncGkpIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSl8PgogIGFycmFuZ2UoZGVzYyhzY2hvb2xfZ3BpKSkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmVvcmRlcihjb3VudHJ5LCBzY2hvb2xfZ3BpKSwgc2Nob29sX2dwaSkpICsgZ2VvbV9jb2woKSArIAogIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAiVG9wIDEwIENvdW50cmllcyIsIHggPSAiY291bnRyeSIsIHkgPSAicHJpbWFyeSBhbmQgc2Vjb25kYXJ5IGVucm9sbG1lbnQsIEdQSSIpCmBgYAoKIyMjIyBiLiDlgKTjgYzlsI/jgZXjgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9zY2hvb2xfZ3BpIHw+IGZpbHRlcih5ZWFyID09IDIwMTkpIHw+IGRyb3BfbmEoc2Nob29sX2dwaSkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShzY2hvb2xfZ3BpKSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZXYoZmN0X3Jlb3JkZXIoY291bnRyeSwgc2Nob29sX2dwaSkpLCBzY2hvb2xfZ3BpKSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJMb3dlc3QgMTAgQ291bnRyaWVzIiwgeCA9ICJjb3VudHJ5IiwgeSA9ICJwcmltYXJ5IGFuZCBzZWNvbmRhcnkgZW5yb2xsbWVudCwgR1BJIikKYGBgCgojIDcuIOWls+aAp+WwseWKtOeOhwoKIyMg44OH44O844K/CgotICAgUmF0aW8gb2YgZmVtYWxlIHRvIG1hbGUgbGFib3IgZm9yY2UgcGFydGljaXBhdGlvbiByYXRlICglKSAobW9kZWxlZCBJTE8gZXN0aW1hdGUp77yaU0wuVExGLkNBQ1QuRk0uWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0wuVExGLkNBQ1QuRk0uWlMpXQoKIyMjIOODh+ODvOOCv+OBruWPluW+lwoKIyMjIyDmupblgpkKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShXREkpCmBgYAoKV0RJIOODkeODg+OCseODvOOCuOOCkuS9v+OBo+OBpuOAgeebtOaOpeODh+ODvOOCv+OCkuODgOOCpuODs+ODreODvOODieOBl+OAgeWkieaVsOWQjeOCkuOAgWBlZF9leHBgIOOBq+aMh+WumuOAggoKYGBge3IgZXZhbCA9IEZBTFNFfQpkZl9qb2JfZ3BpIDwtIFdESShpbmRpY2F0b3IgPSBjKGpvYl9ncGkgPSAiU0wuVExGLkNBQ1QuRk0uWlMiKSkKYGBgCgpgYGB7ciBldmFsID0gRkFMU0V9CndyaXRlX2NzdihkZl9qb2JfZ3BpLCAiZGF0YS9qb2JfZ3BpLmNzdiIpCmBgYAoKYGBge3J9CmRmX2pvYl9ncGkgPC0gcmVhZF9jc3YoImRhdGEvam9iX2dwaS5jc3YiKQpgYGAKCiMjIyDjg4fjg7zjgr/jga7norroqo0KCmBgYHtyfQpkZl9qb2JfZ3BpCmBgYAoKYGBge3J9CnN0cihkZl9qb2JfZ3BpKQpgYGAKCmBgYHtyfQpSRUdJT04gPC0gYygiMUEiLCAiMVciLCAiNEUiLCAiN0UiLCAiOFMiLCAiQjgiLCAiRVUiLCAiRjEiLCAiT0UiLCAiUzEiLCAKIlMyIiwgIlMzIiwgIlM0IiwgIlQyIiwgIlQzIiwgIlQ0IiwgIlQ1IiwgIlQ2IiwgIlQ3IiwgIlYxIiwgIlYyIiwgCiJWMyIsICJWNCIsICJYQyIsICJYRCIsICJYRSIsICJYRiIsICJYRyIsICJYSCIsICJYSSIsICJYSiIsICJYTCIsIAoiWE0iLCAiWE4iLCAiWE8iLCAiWFAiLCAiWFEiLCAiWFQiLCAiWFUiLCAiWFkiLCAiWjQiLCAiWjciLCAiWkYiLCAKIlpHIiwgIlpIIiwgIlpJIiwgIlpKIiwgIlpRIiwgIlpUIikKYGBgCgpgYGB7cn0KZGZfam9iX2dwaSB8PiBmaWx0ZXIoaXNvMmMgJWluJSBSRUdJT04pIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCmBgYHtyfQpkZl9qb2JfZ3BpIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKIyMjIOWIhuaekOOBmeOCi+WbveOBruODquOCueODiAoKIyMjIyAqKuWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnyoqIFRoZSBTb3V0aGVybiBBZnJpY2FuIEN1c3RvbXMgVW5pb24gKFNBQ1UpCgpgYGB7cn0KU09VVEhfQUZSSUNBX0ZJVkUgPC0gYygiU291dGggQWZyaWNhIiwgIk5hbWliaWEiLCAiRXN3YXRpbmkiLCAiQm90c3dhbmEiLCAiTGVzb3RobyIpCmBgYAoKIyMjIyDjg6njg4bjg7PjgqLjg6Hjg6rjgqvjgafjgrjjg4vmjIfmlbDjgYzlpKfjgY3jgYTvvJTjgqvlm70KCmBgYHtyfQpDSE9TRU5fQ09VTlRSSUVTIDwtIGMoIlN1cmluYW1lIiwgIkJlbGl6ZSIsICJCcmF6aWwiLCAiQ29sb21iaWEiKQpgYGAKCiMjIOWIhuaekAoKIyMjIDEuIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoKYGBge3J9CmRmX2pvYl9ncGkgfD4gZHJvcF9uYShqb2JfZ3BpKSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyKSkgKyBnZW9tX2JhcigpCmBgYAoKIyMg6KaW6Kaa5YyWCgojIyMgMi4g5pel5pys44Gu5aWz5oCn5bCx5Yq0546HCgpgYGB7cn0KZGZfam9iX2dwaSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiAKICBkcm9wX25hKGpvYl9ncGkpIHw+IGFycmFuZ2UoZGVzYyh5ZWFyKSkKYGBgCgojIyMgMy4g57WM5bm05aSJ5YyWCgojIyMjIGEuIOaXpeacrAoKYGBge3J9CmRmX2pvYl9ncGkgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gZHJvcF9uYShqb2JfZ3BpKSB8PgogIGdncGxvdChhZXMoeWVhciwgam9iX2dwaSkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgMjAwMOW5tOOBlOOCjeOBi+OCieOBr+S4iuaYh+OBl+OBpuOBhOOCi+OAguOBqeOCk+OBquaUv+etluWkieabtOOBjOOBguOBo+OBn+OBruOBoOOCjeOBhuOBi+OAggoKLSAgIOOBk+OBruOBvuOBvuOAgeS4iuaYh+OBmeOCi+OBqOOAgTIwNDDlubTjgZTjgo3jgavjga/jgIE5MOOCkui2heOBiOOAgTEwMOOBq+i/keOBpeOBj+OAguOBneOCjOOBp+OAgeWVj+mhjOOBr+ino+axuuOBl+OBn+OBqOiogOOBiOOCi+OBruOBoOOCjeOBhuOBi+OAggoKIyMjIyBiLiDljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58KCmBgYHtyfQpkZl9qb2JfZ3BpIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEoam9iX2dwaSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGpvYl9ncGkpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX2pvYl9ncGkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYShqb2JfZ3BpKSB8PgogIGdncGxvdChhZXMoeWVhciwgam9iX2dwaSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAg5YWo5L2T55qE44Gr44Gv5LiK5piH44GX44Gm44GE44KL44CCCgojIyMjIGMuIOODqeODhuODs+OCouODoeODquOCq++8lOOCq+WbvQoKYGBge3J9CmRmX2pvYl9ncGkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKGpvYl9ncGkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBqb2JfZ3BpKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9qb2JfZ3BpIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYShqb2JfZ3BpKSB8PgogIGdncGxvdChhZXMoeWVhciwgam9iX2dwaSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgojIyMg5YiG5biDCgrjg4fjg7zjgr/jga7mlbDjgYvjgonjgIHjgb7jgZrjga/jgIEyMDIw5bm044Gr44Gk44GE44Gm6KaL44Gm44G/44KL44CCCgpgYGB7cn0KZGZfam9iX2dwaSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEoam9iX2dwaSkgfD4KICBnZ3Bsb3QoYWVzKGpvYl9ncGkpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTApCmBgYAoKKirlj4LogIPvvJoqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KZGZfam9iX2dwaSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSAKYGBgCgoqKuWPguiAg++8muaXpeacrOOBqCoqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpKUCA8LSA3NC41MTAyNwpTQUYgPC0gZGZfam9iX2dwaSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBwdWxsKGpvYl9ncGkpCmRmX2pvYl9ncGkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKGpvYl9ncGkpIHw+CiAgZ2dwbG90KCkgKyBnZW9tX2hpc3RvZ3JhbShhZXMoam9iX2dwaSksIGJpbndpZHRoID0gMTApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBTQUYsIGNvbCA9ICJyZWQiKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IEpQLCBjb2wgPSAiYmx1ZSIpICtsYWJzKHRpdGxlID0gIuWls+aAp+OBruWwseWKtOeOhyIsIHN1YnRpdGxlID0gIuaXpeacrO+8mumdkuOAgVNBQ1XvvJrotaQiKQpgYGAKCiMjIyDjg4fjg7zjgr/jgYzljYHliIbjgYLjgovmnIDov5Hjga7lubTjga7lgKTjga4xMOOCq+WbveOBruWApOOBruajkuOCsOODqeODlQoKIyMjIyBhLiDlgKTjgYzlpKfjgY3jgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9qb2JfZ3BpIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEoam9iX2dwaSkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShkZXNjKGpvYl9ncGkpKSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZW9yZGVyKGNvdW50cnksIGpvYl9ncGkpLCBqb2JfZ3BpKSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJUb3AgMTAgQ291bnRyaWVzIiwgeCA9ICJjb3VudHJ5IiwgeSA9ICJsYWJvciBmb3JjZSBwYXJ0aWNpcGF0aW9uIHJhdGUgb2YgIikKYGBgCgojIyMjIGIuIOWApOOBjOWwj+OBleOBhOaWueOBi+OCiQoKYGBge3J9CmRmX2pvYl9ncGkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYShqb2JfZ3BpKSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKGpvYl9ncGkpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3JldihmY3RfcmVvcmRlcihjb3VudHJ5LCBqb2JfZ3BpKSksIGpvYl9ncGkpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIkxvd2VzdCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gImxhYm9yIGZvcmNlIHBhcnRpY2lwYXRpb24gcmF0ZSIpCmBgYAoKIyA4LiDlpbPmgKflpLHmpa3njocKCiMjIOODh+ODvOOCvwoKLSAgIFVuZW1wbG95bWVudCwgZmVtYWxlICglIG9mIGZlbWFsZSBsYWJvciBmb3JjZSkgKG1vZGVsZWQgSUxPIGVzdGltYXRlKe+8mlNMLlVFTS5UT1RMLkZFLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NMLlVFTS5UT1RMLkZFLlpTKV0KCiMjIyDjg4fjg7zjgr/jga7lj5blvpcKCiMjIyMg5rqW5YKZCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCldESSDjg5Hjg4PjgrHjg7zjgrjjgpLkvb/jgaPjgabjgIHnm7TmjqXjg4fjg7zjgr/jgpLjg4Djgqbjg7Pjg63jg7zjg4njgZfjgIHlpInmlbDlkI3jgpLjgIFgZWRfZXhwYCDjgavmjIflrprjgIIKCmBgYHtyIGV2YWwgPSBGQUxTRX0KZGZfZmVtYWxlX3VuZW1wbG95IDwtIFdESShpbmRpY2F0b3IgPSBjKGZlbWFsZV91bmVtcGxveSA9ICJTTC5VRU0uVE9UTC5GRS5aUyIpKQpgYGAKCmBgYHtyIGV2YWwgPSBGQUxTRX0Kd3JpdGVfY3N2KGRmX2ZlbWFsZV91bmVtcGxveSwgImRhdGEvZmVtYWxlX3VuZW1wbG95LmNzdiIpCmBgYAoKYGBge3J9CmRmX2ZlbWFsZV91bmVtcGxveSA8LSByZWFkX2NzdigiZGF0YS9mZW1hbGVfdW5lbXBsb3kuY3N2IikKYGBgCgojIyMg44OH44O844K/44Gu56K66KqNCgpgYGB7cn0KZGZfZmVtYWxlX3VuZW1wbG95CmBgYAoKYGBge3J9CnN0cihkZl9mZW1hbGVfdW5lbXBsb3kpCmBgYAoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI3RSIsICI4UyIsICJCOCIsICJFVSIsICJGMSIsICJPRSIsICJTMSIsIAoiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAKIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgCiJYTSIsICJYTiIsICJYTyIsICJYUCIsICJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaRiIsIAoiWkciLCAiWkgiLCAiWkkiLCAiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCmBgYHtyfQpkZl9mZW1hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKGlzbzJjICVpbiUgUkVHSU9OKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgpgYGB7cn0KZGZfZmVtYWxlX3VuZW1wbG95IHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKIyMjIOWIhuaekOOBmeOCi+WbveOBruODquOCueODiAoKIyMjIyAqKuWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnyoqIFRoZSBTb3V0aGVybiBBZnJpY2FuIEN1c3RvbXMgVW5pb24gKFNBQ1UpCgpgYGB7cn0KU09VVEhfQUZSSUNBX0ZJVkUgPC0gYygiU291dGggQWZyaWNhIiwgIk5hbWliaWEiLCAiRXN3YXRpbmkiLCAiQm90c3dhbmEiLCAiTGVzb3RobyIpCmBgYAoKIyMjIyDjg6njg4bjg7PjgqLjg6Hjg6rjgqvjgafjgrjjg4vmjIfmlbDjgYzlpKfjgY3jgYTvvJTjgqvlm70KCmBgYHtyfQpDSE9TRU5fQ09VTlRSSUVTIDwtIGMoIlN1cmluYW1lIiwgIkJlbGl6ZSIsICJCcmF6aWwiLCAiQ29sb21iaWEiKQpgYGAKCiMjIOWIhuaekAoKIyMjIDEuIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoKYGBge3J9CmRmX2ZlbWFsZV91bmVtcGxveSB8PiBkcm9wX25hKGZlbWFsZV91bmVtcGxveSkgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PgogIGdncGxvdChhZXMoeWVhcikpICsgZ2VvbV9iYXIoKQpgYGAKCiMjIOimluimmuWMlgoKIyMjIDIuIOaXpeacrOOBruWls+aAp+WksealreeOhwoKYGBge3J9CmRmX2ZlbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiAKICBkcm9wX25hKGZlbWFsZV91bmVtcGxveSkgfD4gYXJyYW5nZShkZXNjKHllYXIpKQpgYGAKCiMjIyAzLiDntYzlubTlpInljJYKCiMjIyMgYS4g5pel5pysCgpgYGB7cn0KZGZfZmVtYWxlX3VuZW1wbG95IHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IGRyb3BfbmEoZmVtYWxlX3VuZW1wbG95KSB8PgogIGdncGxvdChhZXMoeWVhciwgZmVtYWxlX3VuZW1wbG95KSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICAyMDAw5bm044GU44KN44GL44KJ44CBMjAxMOW5tOOBlOOCjeOBvuOBp+mdnuW4uOOBq+mrmOOBhOawtOa6luOBq+OBquOBo+OBpuOBhOOCi+OAguS9leOBjOWOn+WboOOBquOBruOBoOOCjeOBhuOAggoKIyMjIyBiLiDljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58KCmBgYHtyfQpkZl9mZW1hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYShmZW1hbGVfdW5lbXBsb3kpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBmZW1hbGVfdW5lbXBsb3kpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX2ZlbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKGZlbWFsZV91bmVtcGxveSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGZlbWFsZV91bmVtcGxveSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAg5bmz5Z2H44Gn6KaL44KL44Go44CBMjMl56iL5bqm44CCCgojIyMjIGMuIOODqeODhuODs+OCouODoeODquOCq++8lOOCq+WbvQoKYGBge3J9CmRmX2ZlbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENIT1NFTl9DT1VOVFJJRVMpIHw+IGRyb3BfbmEoZmVtYWxlX3VuZW1wbG95KSB8PgogIGdncGxvdChhZXMoeWVhciwgZmVtYWxlX3VuZW1wbG95KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9mZW1hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKGZlbWFsZV91bmVtcGxveSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGZlbWFsZV91bmVtcGxveSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgojIyMg5YiG5biDCgrjg4fjg7zjgr/jga7mlbDjgYvjgonjgIHjgb7jgZrjga/jgIEyMDIw5bm044Gr44Gk44GE44Gm6KaL44Gm44G/44KL44CCCgpgYGB7cn0KZGZfZmVtYWxlX3VuZW1wbG95IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcighKGNvdW50cnkgJWluJSBSRUdJT04pKXw+CiAgZHJvcF9uYShmZW1hbGVfdW5lbXBsb3kpIHw+CiAgZ2dwbG90KGFlcyhmZW1hbGVfdW5lbXBsb3kpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMikKYGBgCgoqKuWPguiAg++8mioqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpkZl9mZW1hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgCmBgYAoKKirlj4LogIPvvJrml6XmnKzjgagqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KSlAgPC0gMi41MjAKU0FGIDwtIGRmX2ZlbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBwdWxsKGZlbWFsZV91bmVtcGxveSkKZGZfZmVtYWxlX3VuZW1wbG95IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcighKGNvdW50cnkgJWluJSBSRUdJT04pKXw+CiAgZHJvcF9uYShmZW1hbGVfdW5lbXBsb3kpIHw+CiAgZ2dwbG90KCkgKyBnZW9tX2hpc3RvZ3JhbShhZXMoZmVtYWxlX3VuZW1wbG95KSwgYmlud2lkdGggPSAyKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gU0FGLCBjb2wgPSAicmVkIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBKUCwgY29sID0gImJsdWUiKSArbGFicyh0aXRsZSA9ICIyMDIw5bm044Gu5aWz5oCn44Gu5rGC6IG3546HIiwgc3VidGl0bGUgPSAi5pel5pys77ya6Z2S44CBU0FDVe+8mui1pCIpCmBgYAoKIyMjIOODh+ODvOOCv+OBjOWNgeWIhuOBguOCi+acgOi/keOBruW5tOOBruWApOOBrjEw44Kr5Zu944Gu5YCk44Gu5qOS44Kw44Op44OVCgojIyMjIGEuIOWApOOBjOWkp+OBjeOBhOaWueOBi+OCiQoKYGBge3J9CmRmX2ZlbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKGZlbWFsZV91bmVtcGxveSkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShkZXNjKGZlbWFsZV91bmVtcGxveSkpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3Jlb3JkZXIoY291bnRyeSwgZmVtYWxlX3VuZW1wbG95KSwgZmVtYWxlX3VuZW1wbG95KSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJUb3AgMTAgQ291bnRyaWVzIiwgeCA9ICJjb3VudHJ5IiwgeSA9ICJ1bmVtcGxveW1lbnQgcmF0ZSwgZmVtYWxlLCAyMDIwIikKYGBgCgojIyMjIGIuIOWApOOBjOWwj+OBleOBhOaWueOBi+OCiQoKYGBge3J9CmRmX2ZlbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKGZlbWFsZV91bmVtcGxveSkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShmZW1hbGVfdW5lbXBsb3kpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3JldihmY3RfcmVvcmRlcihjb3VudHJ5LCBmZW1hbGVfdW5lbXBsb3kpKSwgZmVtYWxlX3VuZW1wbG95KSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJMb3dlc3QgMTAgQ291bnRyaWVzIiwgeCA9ICJjb3VudHJ5IiwgeSA9ICJ1bmVtcGxveW1lbnQgcmF0ZSwgZmVtYWxlLCAyMDIwIikKYGBgCgojIOeUt+aAp+WksealreeOhwoKIyMg44OH44O844K/CgotICAgVW5lbXBsb3ltZW50LCBtYWxlICglIG9mIG1hbGUgbGFib3IgZm9yY2UpIChtb2RlbGVkIElMTyBlc3RpbWF0ZSnvvJpTTC5VRU0uVE9UTC5NQS5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TTC5VRU0uVE9UTC5NQS5aUyldCgojIyMg44OH44O844K/44Gu5Y+W5b6XCgojIyMjIOa6luWCmQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgpXREkg44OR44OD44Kx44O844K444KS5L2/44Gj44Gm44CB55u05o6l44OH44O844K/44KS44OA44Km44Oz44Ot44O844OJ44GX44CB5aSJ5pWw5ZCN44KS44CBYGVkX2V4cGAg44Gr5oyH5a6a44CCCgpgYGB7ciBldmFsID0gRkFMU0V9CmRmX2VkX2V4cCA8LSBXREkoaW5kaWNhdG9yID0gYyhlZF9leHAgPSAiU0UuWFBELlRPVEwuR0QuWlMiKSkKYGBgCgpgYGB7ciBldmFsID0gRkFMU0V9CndyaXRlX2NzdihkZl9lZF9leHAsICJkYXRhL2VkX2V4cC5jc3YiKQpgYGAKCmBgYHtyfQpkZl9lZF9leHAgPC0gcmVhZF9jc3YoImRhdGEvZWRfZXhwLmNzdiIpCmBgYAoKIyMjIOODh+ODvOOCv+OBrueiuuiqjQoKYGBge3J9CmRmX2VkX2V4cApgYGAKCmBgYHtyfQpzdHIoZGZfZWRfZXhwKQpgYGAKCmBgYHtyfQpSRUdJT04gPC0gYygiMUEiLCAiMVciLCAiNEUiLCAiN0UiLCAiOFMiLCAiQjgiLCAiRVUiLCAiRjEiLCAiT0UiLCAiUzEiLCAKIlMyIiwgIlMzIiwgIlM0IiwgIlQyIiwgIlQzIiwgIlQ0IiwgIlQ1IiwgIlQ2IiwgIlQ3IiwgIlYxIiwgIlYyIiwgCiJWMyIsICJWNCIsICJYQyIsICJYRCIsICJYRSIsICJYRiIsICJYRyIsICJYSCIsICJYSSIsICJYSiIsICJYTCIsIAoiWE0iLCAiWE4iLCAiWE8iLCAiWFAiLCAiWFEiLCAiWFQiLCAiWFUiLCAiWFkiLCAiWjQiLCAiWjciLCAiWkYiLCAKIlpHIiwgIlpIIiwgIlpJIiwgIlpKIiwgIlpRIiwgIlpUIikKYGBgCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihpc28yYyAlaW4lIFJFR0lPTikgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCiMjIyDliIbmnpDjgZnjgovlm73jga7jg6rjgrnjg4gKCiMjIyMgKirljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58qKiBUaGUgU291dGhlcm4gQWZyaWNhbiBDdXN0b21zIFVuaW9uIChTQUNVKQoKYGBge3J9ClNPVVRIX0FGUklDQV9GSVZFIDwtIGMoIlNvdXRoIEFmcmljYSIsICJOYW1pYmlhIiwgIkVzd2F0aW5pIiwgIkJvdHN3YW5hIiwgIkxlc290aG8iKQpgYGAKCiMjIyMg44Op44OG44Oz44Ki44Oh44Oq44Kr44Gn44K444OL5oyH5pWw44GM5aSn44GN44GE77yU44Kr5Zu9CgpgYGB7cn0KQ0hPU0VOX0NPVU5UUklFUyA8LSBjKCJTdXJpbmFtZSIsICJCZWxpemUiLCAiQnJhemlsIiwgIkNvbG9tYmlhIikKYGBgCgojIyDliIbmnpAKCiMjIyAxLiDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7mo5LjgrDjg6njg5UKCmBgYHtyfQpkZl9lZF9leHAgfD4gZHJvcF9uYShlZF9leHApIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIpKSArIGdlb21fYmFyKCkKYGBgCgojIyDoppbopprljJYKCiMjIyAyLiDml6XmnKzjga7mlZnogrLosrvvvIglIG9mIEdEUO+8iQoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiAKICBkcm9wX25hKGVkX2V4cCkgfD4gYXJyYW5nZShkZXNjKHllYXIpKQpgYGAKCiMjIyAzLiDntYzlubTlpInljJYKCiMjIyMgYS4g5pel5pysCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoeWVhciwgZWRfZXhwKSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICAxOTcw5bm05Luj44Gu5oCl5r+A44Gq5LiK5piH44CBMTk5MOW5tOOBlOOCjeOBruaApea/gOOBquePvuixoeOBr+OAgeS9leOBjOWOn+WboOOBquOBruOBoOOCjeOBhuOAggoKLSAgIDIwMTTlubTjgZTjgo3jgYvjgonmuJvlsJHjgIEyMDE45bm044GU44KN44GL44KJ5aKX5Yqg44CBMjAyMOW5tOOBi+OCiTIwMjHlubTjga/muJvlsJHjgIIKCiMjIyMgYi4g5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoeWVhciwgZWRfZXhwKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYShlZF9leHApIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBlZF9leHApKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOW5s+Wdh+OBp+imi+OCi+OBqOOAgeS4iuaYh+OBl+OBpuOBjeOBpuOBiuOCiuOAgTclIOeoi+W6puOBqOOBhOOBhuWkp+OBjeOBquWJsuWQiOOBq+OBquOBo+OBpuOBhOOCi+OAggoKIyMjIyBjLiDjg6njg4bjg7PjgqLjg6Hjg6rjgqvvvJTjgqvlm70KCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKGVkX2V4cCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGVkX2V4cCkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkKYGBgCgoqKuWPguiAg++8muW5s+Wdh+eahOOBquWApOOCkuabsue3muOBp+ihqOOBmeOBk+OBqOOCguWPr+iDveOBp+OBmeOAgmxvZXNzIOOCkuS9v+OBhuOBqOa7keOCieOBi+OBquabsue3muOBp+i/keS8vOOBl+OBpuOBj+OCjOOBvuOBmeOAgioqCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYShlZF9leHApIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBlZF9leHApKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKIyMjIOWIhuW4gwoK44OH44O844K/44Gu5pWw44GL44KJ44CB44G+44Ga44Gv44CBMjAyMOW5tOOBq+OBpOOBhOOBpuimi+OBpuOBv+OCi+OAggoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoZWRfZXhwKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpCmBgYAoKKirlj4LogIPvvJoqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIApgYGAKCioq5Y+C6ICD77ya5pel5pys44GoKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CkpQIDwtIDMuNDE2OTgxClNBRiA8LSBkZl9lZF9leHAgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gcHVsbChlZF9leHApCmRmX2VkX2V4cCB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdCgpICsgZ2VvbV9oaXN0b2dyYW0oYWVzKGVkX2V4cCksIGJpbndpZHRoID0gMSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IFNBRiwgY29sID0gInJlZCIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gSlAsIGNvbCA9ICJibHVlIikgK2xhYnModGl0bGUgPSAiMjAyMOW5tOOBruaVmeiCsuiyu+OBruWvvkdEUOeZvuWIhueOhyIsIHN1YnRpdGxlID0gIuaXpeacrO+8mumdkuOAgVNBQ1XvvJrotaQiKQpgYGAKCiMjIyDjg4fjg7zjgr/jgYzljYHliIbjgYLjgovmnIDov5Hjga7lubTjga7lgKTjga4xMOOCq+WbveOBruWApOOBruajkuOCsOODqeODlQoKIyMjIyBhLiDlgKTjgYzlpKfjgY3jgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYShlZF9leHApIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSl8PgogIGFycmFuZ2UoZGVzYyhlZF9leHApKSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZW9yZGVyKGNvdW50cnksIGVkX2V4cCksIGVkX2V4cCkpICsgZ2VvbV9jb2woKSArIAogIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAiVG9wIDEwIENvdW50cmllcyIsIHggPSAiY291bnRyeSIsIHkgPSAiR292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24sIHRvdGFsICglIG9mIEdEUCkiKQpgYGAKCiMjIyMgYi4g5YCk44GM5bCP44GV44GE5pa544GL44KJCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEoZWRfZXhwKSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKGVkX2V4cCkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmV2KGZjdF9yZW9yZGVyKGNvdW50cnksIGVkX2V4cCkpLCBlZF9leHApKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIkxvd2VzdCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gIkdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uLCB0b3RhbCAoJSBvZiBHRFApIikKYGBgCgojIDEwLiAg6LKg5YK1546HCgojIyDjg4fjg7zjgr8KCi0gICBOZXQgb2ZmaWNpYWwgZGV2ZWxvcG1lbnQgYXNzaXN0YW5jZSBhbmQgb2ZmaWNpYWwgYWlkIHJlY2VpdmVkIChjdXJyZW50IFVTXCQpIERULk9EQS5BTExELkNEIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0RULk9EQS5BTExELkNEKV0KCiMjIyDjg4fjg7zjgr/jga7lj5blvpcKCiMjIyMg5rqW5YKZCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCldESSDjg5Hjg4PjgrHjg7zjgrjjgpLkvb/jgaPjgabjgIHnm7TmjqXjg4fjg7zjgr/jgpLjg4Djgqbjg7Pjg63jg7zjg4njgZfjgIHlpInmlbDlkI3jgpLjgIFgZWRfZXhwYCDjgavmjIflrprjgIIKCmBgYHtyIGV2YWwgPSBGQUxTRX0KZGZfZWRfZXhwIDwtIFdESShpbmRpY2F0b3IgPSBjKGVkX2V4cCA9ICJTRS5YUEQuVE9UTC5HRC5aUyIpKQpgYGAKCmBgYHtyIGV2YWwgPSBGQUxTRX0Kd3JpdGVfY3N2KGRmX2VkX2V4cCwgImRhdGEvZWRfZXhwLmNzdiIpCmBgYAoKYGBge3J9CmRmX2VkX2V4cCA8LSByZWFkX2NzdigiZGF0YS9lZF9leHAuY3N2IikKYGBgCgojIyMg44OH44O844K/44Gu56K66KqNCgpgYGB7cn0KZGZfZWRfZXhwCmBgYAoKYGBge3J9CnN0cihkZl9lZF9leHApCmBgYAoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI3RSIsICI4UyIsICJCOCIsICJFVSIsICJGMSIsICJPRSIsICJTMSIsIAoiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAKIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgCiJYTSIsICJYTiIsICJYTyIsICJYUCIsICJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaRiIsIAoiWkciLCAiWkgiLCAiWkkiLCAiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGlzbzJjICVpbiUgUkVHSU9OKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKIyMjIOWIhuaekOOBmeOCi+WbveOBruODquOCueODiAoKIyMjIyAqKuWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnyoqIFRoZSBTb3V0aGVybiBBZnJpY2FuIEN1c3RvbXMgVW5pb24gKFNBQ1UpCgpgYGB7cn0KU09VVEhfQUZSSUNBX0ZJVkUgPC0gYygiU291dGggQWZyaWNhIiwgIk5hbWliaWEiLCAiRXN3YXRpbmkiLCAiQm90c3dhbmEiLCAiTGVzb3RobyIpCmBgYAoKIyMjIyDjg6njg4bjg7PjgqLjg6Hjg6rjgqvjgafjgrjjg4vmjIfmlbDjgYzlpKfjgY3jgYTvvJTjgqvlm70KCmBgYHtyfQpDSE9TRU5fQ09VTlRSSUVTIDwtIGMoIlN1cmluYW1lIiwgIkJlbGl6ZSIsICJCcmF6aWwiLCAiQ29sb21iaWEiKQpgYGAKCiMjIOWIhuaekAoKIyMjIDEuIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoKYGBge3J9CmRmX2VkX2V4cCB8PiBkcm9wX25hKGVkX2V4cCkgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PgogIGdncGxvdChhZXMoeWVhcikpICsgZ2VvbV9iYXIoKQpgYGAKCiMjIOimluimmuWMlgoKIyMjIDIuIOaXpeacrOOBruaVmeiCsuiyu++8iCUgb2YgR0RQ77yJCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IAogIGRyb3BfbmEoZWRfZXhwKSB8PiBhcnJhbmdlKGRlc2MoeWVhcikpCmBgYAoKIyMjIDMuIOe1jOW5tOWkieWMlgoKIyMjIyBhLiDml6XmnKwKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gZHJvcF9uYShlZF9leHApIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBlZF9leHApKSArIGdlb21fbGluZSgpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIDE5NzDlubTku6Pjga7mgKXmv4DjgarkuIrmmIfjgIExOTkw5bm044GU44KN44Gu5oCl5r+A44Gq54++6LGh44Gv44CB5L2V44GM5Y6f5Zug44Gq44Gu44Gg44KN44GG44CCCgotICAgMjAxNOW5tOOBlOOCjeOBi+OCiea4m+WwkeOAgTIwMTjlubTjgZTjgo3jgYvjgonlopfliqDjgIEyMDIw5bm044GL44KJMjAyMeW5tOOBr+a4m+WwkeOAggoKIyMjIyBiLiDljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58KCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYShlZF9leHApIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBlZF9leHApKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKGVkX2V4cCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGVkX2V4cCkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAg5bmz5Z2H44Gn6KaL44KL44Go44CB5LiK5piH44GX44Gm44GN44Gm44GK44KK44CBNyUg56iL5bqm44Go44GE44GG5aSn44GN44Gq5Ymy5ZCI44Gr44Gq44Gj44Gm44GE44KL44CCCgojIyMjIGMuIOODqeODhuODs+OCouODoeODquOCq++8lOOCq+WbvQoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENIT1NFTl9DT1VOVFJJRVMpIHw+IGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoeWVhciwgZWRfZXhwKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKGVkX2V4cCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGVkX2V4cCkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgojIyMg5YiG5biDCgrjg4fjg7zjgr/jga7mlbDjgYvjgonjgIHjgb7jgZrjga/jgIEyMDIw5bm044Gr44Gk44GE44Gm6KaL44Gm44G/44KL44CCCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcighKGNvdW50cnkgJWluJSBSRUdJT04pKXw+CiAgZHJvcF9uYShlZF9leHApIHw+CiAgZ2dwbG90KGFlcyhlZF9leHApKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkKYGBgCgoqKuWPguiAg++8mioqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgCmBgYAoKKirlj4LogIPvvJrml6XmnKzjgagqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KSlAgPC0gMy40MTY5ODEKU0FGIDwtIGRmX2VkX2V4cCB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBwdWxsKGVkX2V4cCkKZGZfZWRfZXhwIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcighKGNvdW50cnkgJWluJSBSRUdJT04pKXw+CiAgZHJvcF9uYShlZF9leHApIHw+CiAgZ2dwbG90KCkgKyBnZW9tX2hpc3RvZ3JhbShhZXMoZWRfZXhwKSwgYmlud2lkdGggPSAxKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gU0FGLCBjb2wgPSAicmVkIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBKUCwgY29sID0gImJsdWUiKSArbGFicyh0aXRsZSA9ICIyMDIw5bm044Gu5pWZ6IKy6LK744Gu5a++R0RQ55m+5YiG546HIiwgc3VidGl0bGUgPSAi5pel5pys77ya6Z2S44CBU0FDVe+8mui1pCIpCmBgYAoKIyMjIOODh+ODvOOCv+OBjOWNgeWIhuOBguOCi+acgOi/keOBruW5tOOBruWApOOBrjEw44Kr5Zu944Gu5YCk44Gu5qOS44Kw44Op44OVCgojIyMjIGEuIOWApOOBjOWkp+OBjeOBhOaWueOBi+OCiQoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKGVkX2V4cCkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShkZXNjKGVkX2V4cCkpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3Jlb3JkZXIoY291bnRyeSwgZWRfZXhwKSwgZWRfZXhwKSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJUb3AgMTAgQ291bnRyaWVzIiwgeCA9ICJjb3VudHJ5IiwgeSA9ICJHb3Zlcm5tZW50IGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiwgdG90YWwgKCUgb2YgR0RQKSIpCmBgYAoKIyMjIyBiLiDlgKTjgYzlsI/jgZXjgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYShlZF9leHApIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSl8PgogIGFycmFuZ2UoZWRfZXhwKSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZXYoZmN0X3Jlb3JkZXIoY291bnRyeSwgZWRfZXhwKSksIGVkX2V4cCkpICsgZ2VvbV9jb2woKSArIAogIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAiTG93ZXN0IDEwIENvdW50cmllcyIsIHggPSAiY291bnRyeSIsIHkgPSAiR292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24sIHRvdGFsICglIG9mIEdEUCkiKQpgYGAK